2016-03-25 16 views
1

を認識しないI次のコードを持っている:WCFサービスは、正しいJSON

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

サーバー:

[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"); 
    } 
} 

クライアント:何らかの理由でSetSettings方法については

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()); 
    } 
} 

サーバは常にヌルsettingsオブジェクトを取得します。 settingsオブジェクトタイプをstringに変更すると、すべて動作します。ここで何が間違っているのか分かりません。すべてが正しいように見えます。ここで

は、私は、クライアント上でSetSettingsになったjsonInput文字列の例である:あなたがラップするrequestbody指定

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

投稿するjsonの文字列は何ですか?ここにjsonInput変数の値を投稿できますか? –

+0

@ PankajKapareが追加されました –

+1

このようなリクエストを送信しようとしました{"settings":{"StealthMode": "true"}} –

答えて

2

:したがって

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

を、直列化復元が成功した場合にのみ@Pankajが示唆しているように、あなたは包含オブジェクト内に設定オブジェクトをラップします。

これを行う代わりに、パラメータをラップする必要がないように、属性をWebMessageBodyStyle.Bareに変更してみてください。

関連する問題