如何获取HttpRequestMessage数据

时间:2013-07-31 13:18:55

标签: c# asp.net-mvc

我有一个MVC API控制器,其操作如下。

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

[HttpPost]
public void Confirmation(HttpRequestMessage request)
{
    var content = request.Content;
}

4 个答案:

答案 0 :(得分:74)

来自this answer

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

注意:如评论中所示,此代码可能会导致死锁,因此不应使用。有关详细信息,请参阅this blog post

答案 1 :(得分:21)

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

答案 2 :(得分:11)

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

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

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

}

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

[HttpPost]
public void Confirmation()
{
    var content = Request.Content.ReadAsStringAsync().Result;
}

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

答案 3 :(得分:0)

如果要转换为类而不是仅转换为字符串:

YourClass model = await request.Content.ReadAsAsync<YourClass>();