在 Web API 2 中读取 POST 请求正文

Posted

技术标签:

【中文标题】在 Web API 2 中读取 POST 请求正文【英文标题】:Read POST Request body in Web API 2 【发布时间】:2018-10-30 03:52:25 【问题描述】:

仅出于学习目的,我使用处理程序将所有 http 请求记录到我的 Web API 2 应用程序。

枚举 LogType 信息 = 1,警告 = 2,错误 = 3 公共类 LogHandler: DelegatingHandler 异步保护覆盖任务 SendAsync(HttpRequestMessage httpRequest, CancellationToken cancelToken) Trace.WriteLine(httpRequest.ToString(), LogType.Information.ToString()); var response = await base.SendAsync(httpRequest, cancelToken); 返回响应;

这只是打印请求标头如下:

信息:方法:POST,RequestUri:'http://localhost:49964/school/title?number=1&name=swanand pangam',版本:1.1,内容:System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent,标题: 缓存控制:无缓存 连接:保持活动 接受:文本/csv 接受编码:gzip 接受编码:放气 主机:本地主机:49964 用户代理:PostmanRuntime/7.1.1 邮递员令牌:074c3aab-3427-4368-be25-439cbabe0654 内容长度:31 内容类型:文本/纯文本

但我还在 POST 正文中发送了一个未打印的 json 对象。我想打印标题和正文。此外,我在调试时在“HttpRequestMessage”对象中找不到任何内容。

【问题讨论】:

【参考方案1】:

您应该阅读以下内容

    // log request body
    string requestBody = await httpRequest.Content.ReadAsStringAsync();
    Trace.WriteLine(requestBody);

这将记录请求正文。

【讨论】:

【参考方案2】:

您可以像下面这样阅读发布请求。

 string requestBody = await request.Content.ReadAsStringAsync();
 var response = await base.SendAsync(httpRequest, cancellationToken);

如果你不想记录已经生成的响应,你可以尝试如下。

 var responseBody = await response.Content.ReadAsStringAsync();

以上代码将对您的应用程序产生性能影响,因为它会针对每个操作调用进行,您需要对此保持谨慎。您可以考虑使用一个标志来启用和禁用它。

【讨论】:

感谢您添加响应部分。因为,这是我个人的项目,性能不是问题。【参考方案3】:
  var body = new StreamReader(Request.Body);
    //The modelbinder has already read the stream and need to reset the stream index
    body.BaseStream.Seek(0, SeekOrigin.Begin); 
    var requestBody = body.ReadToEnd();

【讨论】:

以上是关于在 Web API 2 中读取 POST 请求正文的主要内容,如果未能解决你的问题,请参考以下文章

正文未在“获取”POST请求和(我的)解决方案中发送[重复]

如何在访问原始请求正文的同时为 Web API 帮助页面生成正文参数/示例请求

在 Azure API 管理器中验证 POST 请求正文

Asp.Net Web API,AngularJS POST 请求

使用 REST API 查询 Sharepoint Online 并在正文中传递查询 (POST)

当内容类型为文本/纯文本时,.NET Core 1.0 Web Api 将请求正文处理为 JSON