2016-11-03 8 views
3

JSON非同期ポストの内容を受け取って解析するAPIコントローラを作成していますが、そのポスト内のStringContentオブジェクトの内容を読み取ることができません。ApiControllerのStringContentオブジェクトからJSONを読み取るにはどうすればよいですか?

ここに、私の値を見たい私のAPIコントローラのセクションがあります。 ApiControllerメソッドに到着する値はnullです。 jsonContentの値は空の文字列です。私が見たいと思っているのは、JSONオブジェクトの内容です。

public class ValuesController : ApiController 
{ 
    // POST api/values 
    public void Post([FromBody]string value) 
    { 
     HttpContent requestContent = Request.Content; 
     string jsonContent = requestContent.ReadAsStringAsync().Result; 

     // Also tried this per mybirthname's suggestion. 
     // But content ends up equaling 0 after this runs. 
     var content = Request.Content.ReadAsStreamAsync().Result.Seek(0, System.IO.SeekOrigin.Begin); 
    } 
} 

ここでは、どのように呼び出されているかを示すコントローラです。

[HttpPost] 
public ActionResult ClientJsonPoster(MyComplexObject myObject) 
{ 
    this.ResponseInfo = new ResponseInfoModel(); 
    PostToAPI(myObject, "http://localhost:60146", "api/values").Wait(); 
    return View(this.ResponseInfo); 
} 

これは転記方法です。

private async Task PostToAPI(object myObject, string endpointUri, string endpointDirectory) 
{ 
    string myObjectAsJSON = System.Web.Helpers.Json.Encode(myObject); 
    StringContent stringContent = new StringContent(myObjectAsJSON, Encoding.UTF8, "application/json"); 
    using (HttpClient httpClient = new HttpClient()) 
    { 
     httpClient.BaseAddress = new Uri(endpointUri); 
     using (HttpResponseMessage responseMessage = await httpClient.PostAsJsonAsync(endpointDirectory, stringContent).ConfigureAwait(false)) 
     { 
      // Do something 
     } 
    } 
} 

私は、ApiController内のPostメソッドのシグネチャに問題があると考えます。しかし、どのように変化させるべきか分かりません。ご協力いただきありがとうございます。

+1

[ASP.NET WEBAPIコントローラでRequest.Contentを読み取ることができません](http://stackoverflow.com/questions/10127803/cannot-read-request-content-inの可能性のある重複-asp-net-webapi-controller)を使用します。それが本当に良い理由を説明する7 upvotesで答えを確認してください! – mybirthname

+1

それがどのように呼び出されているかを示します。通常はデッドロックにつながる非同期呼び出しと同期呼び出しを混在させるように見えます。手掛かりは、あなたのeximpleの '.Wait()'です。 – Nkosi

+0

提案していただきありがとうございます。私はコンテンツストリームの位置をリセットしようとしましたが、値0でlongを返しました。私はそれをどのようにPost()メソッドに適用したかを見ることができます。また、.Wait()が間違っている場合、デッドロックを回避するためにはどのように調整する必要がありますか?ありがとう。 –

答えて

2

デッドロックにつながる非同期呼び出しと同期呼び出しが混在しています。また

[HttpPost] 
public async Task<ActionResult> ClientJsonPoster(MyComplexObject myObject) { 
    this.ResponseInfo = new ResponseInfoModel(); 
    await PostToAPI(myObject, "http://localhost:60146", "api/values"); 
    return View(this.ResponseInfo); 
} 

更新コントローラは、リクエストボディから単純型を読み取るためのWeb APIを強制するために使用されます。

更新アピ

public class ValuesController : ApiController { 
    // POST api/values 
    [HttpPost] 
    public async Task Post() { 
     var requestContent = Request.Content; 
     var jsonContent = await requestContent.ReadAsStringAsync(); 

    } 
} 
+0

ありがとう、私はこれを撃つだろう。 –

+0

これはチャンピオン@Nkosiのように働いた。ご協力いただきありがとうございます。 –

関連する問題