如何获取HttpRequestMessage数据

use*_*362 50 c# asp.net-mvc

我有一个MVC API控制器,具有以下操作.

我不明白如何阅读消息的实际数据/正文?

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
}
Run Code Online (Sandbox Code Playgroud)

Man*_*eld 75

这个答案:

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
    string jsonContent = content.ReadAsStringAsync().Result;
}
Run Code Online (Sandbox Code Playgroud)

注意:如注释中所示,此代码可能会导致死锁,因此不应使用.有关详细信息,请参阅此博客文章.

  • 对于可能导致死锁的解决方案的52个upvotes可能意味着有很多不正确的异步代码在那里浮动.在这种情况下始终使用async/await. (22认同)
  • 有关为什么会出现死锁的详细信息:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html (4认同)
  • 人们,请阅读@ToddMenier的评论:不要在生产中使用此代码.它出现在我们的代码中并且已经陷入僵局. (3认同)
  • 从开发人员的角度来看,如果您想要调试或等到操作完成才能查看数据,那么使用 aync 可能不是更好的选择。 (2认同)

Zeb*_*Lin 23

  System.IO.StreamReader reader = new System.IO.StreamReader(HttpContext.Current.Request.InputStream);
  reader.BaseStream.Position = 0;
  string requestFromPost = reader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,而接受的答案却没有. (6认同)
  • 这适用于 MVC,而仅适用于 Web Api (2认同)

Kha*_* TO 11

我建议你不应该这样做.行动方法应设计成易于单元测试.在这种情况下,您不应该直接从请求中访问数据,因为如果您这样做,当您想要对此代码进行单元测试时,您必须构造一个HttpRequestMessage.

你应该这样做让MVC为你做所有的模型绑定:

[HttpPost]
public void Confirmation(YOURDTO yourobj)//assume that you define YOURDTO elsewhere
{
        //your logic to process input parameters.

}
Run Code Online (Sandbox Code Playgroud)

如果您确实想要访问该请求.您只需访问控制器的Request属性(而不是通过参数).像这样:

[HttpPost]
public void Confirmation()
{
    var content = Request.Content.ReadAsStringAsync().Result;
}
Run Code Online (Sandbox Code Playgroud)

在MVC中,Request属性实际上是.NET HttpRequest的包装器,并从基类继承.当你需要进行单元测试时,你也可以模拟这个对象.