2013-10-03 8 views
5

Ich verwende Wcf Service und JS.Senden einer Liste in einem Objekt an Wcf Service

Ich sende Informationen zu meinem Service von AJAX.

Ich habe eine Funktion in den Dienst, das folgende Objekt akzeptiert:

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

die BusinessService.cs:

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

ich die Objekte in meinem JS JSON analysieren und sie an die schicken Bedienung.

Hier ist die json, die an die WCF-Funktion senden:

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

Alles funktioniert, wie es die Services Liste ausnehmen sollte.

Die Liste kommt zu der Funktion wcf als null.

Ich habe keine Ahnung, warum das passiert, würde ich Hilfe zu schätzen wissen?

Antwort

4

Sie können keine List<T> aus JSON-Daten instanziieren. Was Sie tun können, ist ersetzen:

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

mit

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

Das heißt, ersetzen List<T> mit Array of T

+0

Es hat auch nicht geholfen. Die Liste wird weiterhin null. –

+0

Nun, Ihre JSON-Darstellung ist gut geformt, so dass ich nicht verstehen kann, was falsch ist, können Sie noch mehr Code senden? Zum Beispiel der C# -Code, der den Aufruf verarbeitet, und der JavaScript-Code, der die Anfrage sendet? –

+0

Funktioniert es wirklich? Ich gehe auch durch dasselbe Szenario! Ich brauche diesen Code. –

0

können Sie WCF Service Trace Viewer Sie verwenden, um anzuzeigen zu helfen und die Fehler verfolgen Sie von der Get Bedienung.

0

dies versuchen,

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

hinzufügen unten in dem Ajax-Aufruf

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

der folgende Code, um die Daten

public ActionResult BusinessCall(Business business){} 
0

Die folgende sage ich definitiv funktioniert, kann zu empfangen. Ich habe es gerade getestet. Tut mir leid, es ist in vb.net, aber Sie sollten die Idee bekommen.

Auf der Serverseite: In 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 

In 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 

verdrahtet ich die webconfig Einstellungen auf.Und setzen diese Jquery Ajax-Aufruf auf der Client-Seite:

$("#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) { 

       } 
      }); 


     }); 

Ich kann bestätigen, dass die angeforderte Payload war wie folgt:

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

und der WCF-Dienst deserialisiert alles gut. Ich denke, was Sie vermisst haben, war das [CollectionDataContract] Attribut.

UPDATE: Ich habe versucht, das Attribut [CollectionDataContract] zu entfernen, und es funktionierte noch. Ich vermute also, dass die Datenvertragsattribute nur zur Serialisierung dienen, nicht zur Deserialisierung benötigt werden (?)

Verwandte Themen