2017-06-27 3 views
1

私は既存のプロセスの1つで使用されているHTTPクライアントライブラリを作成しました。 JSONコンテンツを含むPOSTリクエストを本文に送信します。リクエストの内容とオブジェクト自体を埋め込むコードは以下のようになります。ObjectContentの問題を使用してJSONをシリアライズ

… 
     HttpRequestMessage httpMessage = new HttpRequestMessage(HttpMethod.Post, "http://localhost"); 
     MyWireObject request = new MyWireObject() 
     { 
      Email = "[email protected]", 
      Document = JToken.Parse(@"{""content"": ""data"", ""content2"": ""data2""}") 
     }; 
     httpMessage.Content = new ObjectContent(typeof(MyWireObject), request, new JsonMediaTypeFormatter()); 
     //httpMessage.Content = new StringContent(JToken.FromObject(request).ToString(), Encoding.UTF8, "application/json"); 

     var content = httpMessage.Content; 
     string jsonContent = content.ReadAsStringAsync().Result; 
… 

public class MyWireObject 
{ 
    [JsonProperty(PropertyName = "Email")] 
    public string Email 
    { 
     get; set; 
    } 

    [JsonProperty(PropertyName = "Document")] 
    public JToken Document 
    { 
     get; set; 
    } 
} 

私が書いたスタンドアロンのexeでクライアントライブラリを使用すると、JSONはうまくシリアル化されます。しかし、私は既存のプロセスと統合する場合、(jsonContentで捕獲された)結果は次のようなものになります。

{"Email":"[email protected]","Document":{"content":[],"content2":[]} } 

を基本的には、JTokenフィールドのすべての値が失われます。コメントされた行のように、ObjectContentの代わりにStringContentを使用すると、動作します。

私のスタンドアロンのexeと既存のプロセスとの違いは、プロセスがネットワークサービスアカウントで動作することです。これはアカウントの許可によるものですか?または私はそれを間違って使用していますか?または.NETやNewtonsoft.Json.Linqの既知のバグが原因ですか?

ありがとうございました。

答えて

0

は、なぜあなたは別のアプローチを取り、使用しないNewtonsoft.Json:

using Newtonsoft.Json; 

// First define the classes you will need ... 

public class Document 
{ 
    public string Content1 { get; set; } 
    public string Content2 { get; set; } 
    // ... 
} 

public class MyWireObject 
{ 
    public string Email { get; set; } 
    public Document Document { get; set; } 
} 

// Later, create an instance and serialize it as the body of your request ... 

HttpRequestMessage httpMessage = new HttpRequestMessage(HttpMethod.Post, "http://localhost"); 
MyWireObject myWireObject = new MyWireObject() 
{ 
    Email = "[email protected]", 
    Document = new Document() 
    { 
     Content1 = "content1", 
     Content2 = "content2", 
     // ... 
    } 
}; 

httpMessage.Content = JsonConvert.SerializeObject(myWireObject); 

// Later in the POST handler ... 

string myWireObjectAsString = httpMessage.Content.ReadAsStringAsync().Result; 

// Or even better ... 

MyWireObject myWireObject = JsonConvert.DeserializeObject<MyWireObject>(myWireObjectAsString); 

// And use the object ... 
関連する問題