【问题标题】:How to get HttpRequestMessage data如何获取 HttpRequestMessage 数据
【发布时间】:2013-07-31 13:18:54
【问题描述】:

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

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

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

【问题讨论】:

  • 你从request.Content得到什么?
  • 我看到了所有的标题和内容长度,但是数据在哪里?

标签: c# asp.net-mvc


【解决方案1】:

来自this answer

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

注意:正如在 cmets 中看到的那样,此代码可能会导致死锁,不应使用。详情请参阅this blog post

【讨论】:

  • 从开发人员的角度来看,如果您想调试或等待操作完成查看数据,使用 aync 可能不是更好的选择。
  • 52 票赞成一个可能导致死锁的解决方案可能意味着有 很多 不正确的异步代码漂浮在那里。在这种情况下始终使用 async/await。
  • 人们,请阅读@ToddMenier 的评论:请勿在生产中使用此代码。它出现在我们的代码中并且已经死锁。
  • 这是错误的解决方案。看看@Zebing Lin 的回答
【解决方案2】:
using System.IO;

string requestFromPost;
using( StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream) )
{
    reader.BaseStream.Position = 0;
    requestFromPost = reader.ReadToEnd();
}

【讨论】:

  • Request.Content 是一个流。根据您的代码运行的确切时间,流可能已被使用。
  • 这适用于 MVC,而接受的答案仅适用于 Web Api
  • BaseStream.Position = 0 让我了解到,如果内容被框架吃掉以填充 HttpPost 方法的参数,则流可能会被重置。它是。谢谢。
  • 这对我也有用,应该是公认的答案。
【解决方案3】:

我建议你不要这样做。 操作方法应设计为易于单元测试。在这种情况下,你不应该直接从请求中访问数据,因为如果你这样做,当你想对这段代码进行单元测试时,你必须构造一个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 的包装器,并且继承自基类。当你需要进行单元测试时,你也可以模拟这个对象。

【讨论】:

  • 如果你有 HttpGet?如果我使用 Request.Content.ReadAsStringAsync().Result;它不起作用!
  • @ayasha:使用 HttpGet,参数应该来自查询字符串而不是请求正文。
  • @ayasha:我也更新了答案。刚刚意识到它之前不起作用
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多