web-dev-qa-db-ja.com

ApiControllerのStringContentオブジェクトからJSONを読み取るにはどうすればよいですか?

JSON非同期ポストのコンテンツを受信して​​解析することを目的としたAPIコントローラを作成していますが、そのポストのStringContentオブジェクトのコンテンツを読み取ることができません。

これは、値が表示されることが期待される私の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メソッドのシグネチャに何か問題があると思います。しかし、それをどのように変更すべきかわかりません。ご協力いただきありがとうございます。

8
Ken Palmer

デッドロックを引き起こす非同期呼び出しと同期呼び出しを混在させています。

コントローラをに更新

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

また、 [FromBody] を使用して、Web APIにリクエストの本文から単純なタイプを強制的に読み取らせます。

APIを更新

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

    }
}
6
Nkosi