将对象中的列表发送到Wcf服务

我使用Wcf ServiceJS

我通过AJAX向我的服务发送信息。

我在服务中有一个接受以下对象的函数:

  [DataContract] public class Business { [DataMember] public string Name { get; set; } [DataMember] public string Desc { get; set; } [DataMember] public List Services { get; set; } } 

BusinessService.cs:

  [DataContract] public class BusinessService { [DataMember] public string Name { get; set; } [DataMember] public string Desc { get; set; } [DataMember] public int LongTime { get; set; } } 

我将JS中的对象解析为JSON并将它们发送到服务。

这里发送到wcf函数的json:

 "{"ManageBusiness":{"Name":"aaaaaa","Desc":"aaaaaaaaaaaa","Services":[{"Name":"aaaaaa","Desc":"aaaaaa","LongTime":30},{"Name":"aaaaaa1","Desc":"aaaaaa","LongTime":30}]}}" 

Services列表外,一切正常。

该列表作为null来到wcf函数。

我不知道为什么会这样,我会很感激帮助吗?

您无法从JSON数据实例化List 。 你可以做的是替换:

 [DataContract] public class Business { [DataMember] public string Name { get; set; } [DataMember] public string Desc { get; set; } [DataMember] public List Services { get; set; } } 

 [DataContract] public class Business { [DataMember] public string Name { get; set; } [DataMember] public string Desc { get; set; } [DataMember] public BusinessService[] Services { get; set; } } 

也就是说,将List替换Array of T

您可以使用WCF服务跟踪查看器来帮助您查看和跟踪从服务获得的错误。

试试这个,

 var data = "{"ManageBusiness":{"Name":"aaaaaa","Desc":"aaaaaaaaaaaa","Services":[{"Name":"aaaaaa","Desc":"aaaaaa","LongTime":30},{"Name":"aaaaaa1","Desc":"aaaaaa","LongTime":30}]}}"; 

在下面的ajax调用中添加

 contentType: "application/json", data: JSON.stringify({ business: data }), 

以下代码接收数据

 public ActionResult BusinessCall(Business business){} 

以下我可以说明确有效。 我刚试过它。 对不起它在vb.net,但你应该明白了。

在服务器端:在IService1.vb中

 Imports System.ServiceModel Imports System.ServiceModel.Activation Imports System.ServiceModel.Web Namespace Webservices  Public Interface IService1  _  _ Function test(manageBusiness As ManagedBusiness) As string End Interface End Namespace 

在Service1.svc.vb中

 Imports System.Runtime.Serialization Imports System.ServiceModel.Activation Namespace Webservices  Public Class Service1 Implements IService1 Public function test(manageBusiness As ManagedBusiness) As string Implements IService1.test Return "done" End function End Class  Public Class Services Inherits List(Of Service) End Class  Public Class Service Public Property Name As String Public Property Desc As String Public Property LongTime As Integer End Class  Public Class ManagedBusiness Public Property Name As String Public Property Desc As String Public Property Services As Services End Class End NameSpace 

我连接了webconfig设置。 并在客户端将此jquery ajax调用:

 $("#btnTest").click(function () { var services = []; services.push({ Name: "aaaaaa", Desc: "aaaaaa", LongTime: 30 }); services.push({ Name: "aaaaaa1", Desc: "aaaaaa", LongTime: 30 }); var data = {}; data.manageBusiness = { Name: "aaaaaa", Desc: "aaaaaaaaaaaa", Services: services } $.ajax({ type: "POST", url: "http://localhost:64110/Webservices/Service1.svc/test", dataType: "json", contentType: "application/json; charset=utf-8", async: true, data: JSON.stringify(data), success(msg) { } }); }); 

我可以确认请求的有效负载如下:

 {"manageBusiness":{"Name":"aaaaaa","Desc":"aaaaaaaaaaaa","Services":[{"Name":"aaaaaa","Desc":"aaaaaa","LongTime":30},{"Name":"aaaaaa1","Desc":"aaaaaa","LongTime":30}]}} 

并且WCF服务对一切都进行了反序列化。 我认为你缺少的是[CollectionDataContract]属性。

更新:我尝试删除[CollectionDataContract]属性,它仍然有效。 所以我猜测数据契约属性仅用于序列化,反序列化不需要(?)