64

我有一个具有以下操作的 MVC API 控制器。

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

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

4 回答 4

83

这个答案

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

注意:如评论中所见,此代码可能会导致死锁,不应使用。有关更多详细信息,请参阅此博客文章

于 2013-07-31T13:28:33.487 回答
30
using System.IO;

string requestFromPost;
using( StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream) )
{
    reader.BaseStream.Position = 0;
    requestFromPost = reader.ReadToEnd();
}
于 2015-07-27T02:44:51.233 回答
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 的包装器,并且继承自基类。当你需要进行单元测试时,你也可以模拟这个对象。

于 2013-07-31T13:43:40.447 回答
2

如果您想转换为一个类而不仅仅是一个字符串:

YourClass model = await request.Content.ReadAsAsync<YourClass>();
于 2019-01-22T07:25:57.443 回答