C# 如何从ApicController中的StringContent对象读取JSON?

C# 如何从ApicController中的StringContent对象读取JSON?,c#,json,asp.net-mvc,asp.net-web-api,async-await,C#,Json,Asp.net Mvc,Asp.net Web Api,Async Await,我正在编写一个API控制器,用于接收和解析JSON异步帖子的内容,但无法读取该帖子中StringContent对象的内容 下面是我的API控制器的一节,我希望在这里看到值。到达ApicController方法的值为null。jsonContent值是一个空字符串。我希望看到的是JSON对象的内容 public class ValuesController : ApiController { // POST api/values public void Post([FromBody

我正在编写一个API控制器,用于接收和解析JSON异步帖子的内容,但无法读取该帖子中StringContent对象的内容

下面是我的API控制器的一节,我希望在这里看到值。到达ApicController方法的值为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方法的签名有问题。但我不知道该如何改变。谢谢您的帮助。

您正在混合异步和同步调用,这将导致死锁

将控制器更新为

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

可能的副本。用7张选票检查答案,解释为什么真的很好!显示它是如何被调用的。看起来您混合了异步和同步调用,这通常会导致死锁。线索就是你例子中的
.Wait()
。谢谢你的建议。我尝试重置内容流位置,结果返回一个值为0的long。您可以看到我是如何在Post()方法中应用它的。另外,如果.Wait()错误,需要如何调整以避免死锁?谢谢。谢谢,我会试试看。这就像冠军@Nkosi。感谢您的帮助。使用
requestContent.ReadAsStringAsync().Result
仅从json获取内容
public class ValuesController : ApiController {
    // POST api/values
    [HttpPost]
    public async Task Post() {
        var requestContent = Request.Content;
        var jsonContent = await requestContent.ReadAsStringAsync();

    }
}