2016-03-25 3 views
1

Ich habe den folgenden Code:WCF-Dienst erkennt nicht korrekt JSON

[DataContract] 
public class OptimizationServiceSettings 
{ 
    [DataMember] 
    public bool StealthMode { get; set; } 
} 

Server:

[WebInvoke(Method = "POST", UriTemplate = "SetSettings", BodyStyle = WebMessageBodyStyle.WrappedRequest, 
    ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] 
[OperationContract] 
public void SetSettings(OptimizationServiceSettings settings) 
{ 
    if (settings != null) 
    { 
     _stageOptimizer.ServiceSettings = settings; 
    } 
    else 
    { 
     Trace.TraceError("Attemp to set null OptimizationServiceSettings"); 
    } 
} 

Auftraggeber:

private static void SetSettings() 
{ 
    OptimizationServiceSettings op = new OptimizationServiceSettings(); 
    op.StealthMode = true; 

    string jsonInput = ToJson(op); 
    var client = new WebClient(); 
    client.Headers["Content-type"] = "application/json"; 
    client.Encoding = Encoding.UTF8; 
    var response = client.UploadString("http://localhost:8080/BlocksOptimizationServices/SetSettings", "POST", jsonInput); 
} 

private static string ToJson<T>(T data) 
{ 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     serializer.WriteObject(ms, data); 
     return Encoding.Default.GetString(ms.ToArray()); 
    } 
} 

Aus irgendeinem Grund die SetSettings Methode auf die Server erhält immer ein Null settings Objekt. Wenn ich den Objekttyp settings in string ändere, funktioniert alles. Ich verstehe nicht, was hier falsch ist. Alles sieht so aus, als wäre es korrekt. Hier

ist ein Beispiel für die jsonInput Zeichenfolge, die ich in SetSettings auf dem Client bekam:

"{\"StealthMode\":\"true\"}" 
+0

Welche json Zeichenfolge, die Sie posten? Können Sie hier den Wert der jsonInput-Variable posten? –

+0

@ PankajKapare hinzugefügt –

+1

Versuchen Sie, Anfrage JSON so etwas wie diese {"Einstellungen": {"StealthMode": "True"}} –

Antwort

2

Sie die requestbody angegeben werden eingewickelt:

[WebInvoke(..., BodyStyle = WebMessageBodyStyle.WrappedRequest, ...] 

daher nur die Deserialisierung ist erfolgreich, wenn Sie umhüllen das Einstellungsobjekt innerhalb eines enthaltenden Objekts, wie es @ Pankaj vorgeschlagen hat.

Anstatt dies zu tun, könnten Sie versuchen, das Attribut in WebMessageBodyStyle.Bare zu ändern, um die Notwendigkeit zu vermeiden, den Parameter zu umbrechen.

Verwandte Themen