【问题标题】:Sending a list within an object to Wcf Service将对象内的列表发送到 Wcf 服务
【发布时间】:2013-10-03 12:47:08
【问题描述】:

我使用Wcf ServiceJS

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

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

  [DataContract]
    public class Business
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Desc { get; set; }        
        [DataMember]
        public List<BusinessService> 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 列表外,一切正常。

该列表作为空值出现在 wcf 函数中。

我不知道为什么会这样,我希望能得到帮助吗?

【问题讨论】:

    标签: javascript ajax json wcf jquery


    【解决方案1】:

    您不能从 JSON 数据实例化 List&lt;T&gt;。你可以做的是替换:

    [DataContract]
        public class Business
        {
            [DataMember]
            public string Name { get; set; }
            [DataMember]
            public string Desc { get; set; }        
            [DataMember]
            public List<BusinessService> 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; }
        }
    

    即用Array of T替换List&lt;T&gt;

    【讨论】:

    • 它也没有帮助。该列表继续为空。
    • 嗯,您的 JSON 表示格式正确,所以我无法理解有什么问题,您能再发送一些代码吗?例如处理调用的 c# 代码和发送请求的 javascript 代码?
    • 真的有效吗?我也在经历同样的场景!我需要那个代码。
    • 是的,您可以从 JSON 数据中获取 List。请参阅下面的答案。
    【解决方案2】:

    您可以使用WCF Service Trace Viewer 来帮助您查看和跟踪您从服务中得到的错误。

    【讨论】:

      【解决方案3】:

      试试这个,

      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){}
      

      【讨论】:

        【解决方案4】:

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

        在服务器端: 在 IService1.vb 中

        Imports System.ServiceModel
        Imports System.ServiceModel.Activation
        Imports System.ServiceModel.Web
        
        Namespace Webservices
           <ServiceContract()>
            Public Interface IService1
        
            <OperationContract()> _
            <WebInvoke(method:="POST", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.WrappedRequest)> _
            Function test(manageBusiness As ManagedBusiness) As string
        
           End Interface
        End Namespace
        

        在Service1.svc.vb中

        Imports System.Runtime.Serialization
        Imports System.ServiceModel.Activation
        Namespace Webservices
        <AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Required)>
        Public Class Service1
            Implements IService1 
            Public function test(manageBusiness As ManagedBusiness) As string Implements IService1.test 
               Return "done"   
             End function    
        End Class   
        
        <CollectionDataContract()>
        Public Class Services
            Inherits List(Of Service)
        End Class
        
        <DataContract()>
        Public Class Service
            <DataMember()>Public Property Name As String
            <DataMember()>Public Property Desc As String
            <DataMember()>Public Property LongTime As Integer 
        End Class
        
        <DataContract()>
        Public Class ManagedBusiness 
            <DataMember()>Public Property Name As String
            <DataMember()>Public Property Desc As String
            <DataMember()>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] 属性,它仍然有效。所以我猜测数据契约属性仅用于序列化,不需要用于反序列化(?)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-11
          • 1970-01-01
          • 2012-07-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多