2013-10-12 13 views
5

Sto tentando di creare un servizio Web riposante in dotnet (VS 2012) che accetta un elenco JSON. C'è questo post molto utile.Invia la matrice JSON ai risultati del servizio di riposo WCF in parametri vuoti. DataContract?

Jquery Ajax Posting json to webservice

L'esempio è a posto, ma ho bisogno del DataContract allineati. Qui è il mio problema:

messaggi

Fiddler:

{ "Markers": [ 
{ "position": "128.3657142857143", "markerPosition": "7" }, 
{ "position": "235.1944023323615", "markerPosition": "19" }, 
{ "position": "42.5978231292517", "markerPosition": "-3" } 
]}; 

Nel VS2012 Debugger vedo l'equivalente:

{ "Markers": [ 
{ "position": "0", "markerPosition": "0" }, 
{ "position": "0", "markerPosition": "0" }, 
{ "position": "0", "markerPosition": "0" } 
]}; 

Ecco il codice (direttamente dal esempio connessi):

public class Marker 
{ 
    decimal position { get; set; } 
    int markerPosition { get; set; } 
} 

public string CreateMarkers(List<Marker> Markers) 
{ 
    return "Received " + Markers.Count + " markers."; 
} 

Questo è il contratto:

[OperationContract] 
[WebInvoke(UriTemplate = "Markers", Method = "POST", ResponseFormat = WebMessageFormat.Json, 
RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
string CreateMarkers(List<Marker> Markers); 

Questo altro, altrettanto meravigliosa, posta spiega che il DataContract deve essere impostato per vedere i valori dei parametri:

WCF REST POST of JSON: Parameter is empty

La mia domanda iniziale era quello che dovrebbe essere il contratto di dati. Ho iniziato con:

[OperationContract] 
[WebInvoke(UriTemplate = "Markers", Method = "POST", ResponseFormat =   WebMessageFormat.Json, 
RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
string CreateMarkers(List<Marker> Markers); 

Dopodiché passa la struttura del messaggio, ma il contenuto è nullo. Quindi, su suggerimento, ho provato:

[OperationContract] 
[WebInvoke(UriTemplate = "Markers", Method = "POST", ResponseFormat =   WebMessageFormat.Json, 
RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] 
string CreateMarkers(List<Marker> Markers); 

Dopo di che la struttura del messaggio e il contenuto erano nulli.

[OperationContract] 
    [WebInvoke(UriTemplate = "WrappedMarkers", Method = "POST", ResponseFormat = WebMessageFormat.Json, 
     RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] 
    string WrappedMarkers(MarkerRequest wrappedmarkers); 

[DataContract] 
    public class MarkerRequest 
    { 
    [DataMember] 
    public List<Marker> Markers 
    { 
     get { return _markers; } 
     set { _markers = value; } 
    } 

    private List<Marker> _markers = new List<Marker>(); 
} 


public string WrappedMarkers(MarkerRequest wrappedmarkers) 
    { 
     return wrappedmarkers.Markers.ToString(); 
    } 

Ecco le operazioni contratte, modificati per WrappedRequest

La struttura era corretto, ma il contenuto era nuovamente nullo.

Torna al punto di partenza. Mi sembra di poter vedere la struttura del messaggio. Come faccio a mappare il contenuto alla struttura?

risposta

8

Come par la mia conoscenza È sempre '0' valore a causa di voi non ha fissato [DataContract] e [DataMember] attributo sulla classe di dati. Dopo aver aggiunto quelle attr, la tua classe dovrebbe essere simile a

[DataContract] 
public class Marker 
{ 
    [DataMember] 
    decimal position { get; set; } 
    [DataMember] 
    int markerPosition { get; set; } 
} 
+0

Sì. Questo ha risolto il problema. Subito. Grazie! –

Problemi correlati