当前位置: 首页 > 知识库问答 >
问题:

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

苏昂雄
2023-03-14

只是为了学习目的,我使用处理程序将所有超文本传输协议请求记录到我的Web API 2应用程序

enum LogType {Information = 1, Warning = 2, Error = 3 }
public class LogHandler: DelegatingHandler
{
    async protected override Task SendAsync(HttpRequestMessage httpRequest, CancellationToken cancellationToken)
    {
        Trace.WriteLine(httpRequest.ToString(), LogType.Information.ToString());
        var response = await base.SendAsync(httpRequest, cancellationToken);
        return response;
    }
}

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

Information: Method: POST, RequestUri: 'http://localhost:49964/school/title?number=1&name=swanand pangam', Version: 1.1, Content: System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent, Headers:
{
  Cache-Control: no-cache
  Connection: keep-alive
  Accept: text/csv
  Accept-Encoding: gzip
  Accept-Encoding: deflate
  Host: localhost:49964
  User-Agent: PostmanRuntime/7.1.1
  Postman-Token: 074c3aab-3427-4368-be25-439cbabe0654
  Content-Length: 31
  Content-Type: text/plain
}

但是我也在POST正文中发送一个json对象,它没有打印。我想打印标题和正文。此外,我在调试时找不到任何东西在'HttpquiestMessage'对象。

共有3个答案

胡承载
2023-03-14
  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();

姚煜
2023-03-14

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

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

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

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

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

佟阳云
2023-03-14

你应该阅读以下内容

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

这将记录请求正文。

 类似资料:
  • 我有一个静态网站托管在AWS CloudFront上。在一条路由上,我需要接受POST方法,因为它是OAuth服务器的重定向,所以我决定开发一个lambda@edge。 我的想法是在'Viewer Request'上注册lambda并截取POST方法,读取正文并复制标头上的值,以使它们在我的静态网站上可读(我知道我可以用javascript访问Referrer标头)。 我设置了Lambda,我可以

  • 问题内容: 我现在使用的代码: 似乎工作正常,但我不确定在将ByteBuffer返回池之前是否需要ByteBuffer。我什至不确定要使用。文档中没有太多关于它的内容。 问题答案: 读取请求正文的一种更简单的方法是将其分派到一个工作线程,该工作线程可以使用。 有两种方法:使用或文档中所示的调度模式。这是使用的示例: 在基本上没有派遣你。

  • 问题内容: 我正在写一个注册为Webhook端点的脚本。我知道它已成功注册,因为我正在将每个请求的标头写入服务器日志。这是一个示例: 我已经注册的API是将JSON对象发布到脚本中,我想使用PHP解析该对象。从请求标头可以看到,有一个不错的大胖JSON对象正在等待解析。看起来很简单,但事实并非如此。 最初,我尝试使用或,但是由于数据不在数组中,因此我不确定如何访问数据。 我试过使用和不使用,但没有

  • 他们在vertx网站上的文档不太清楚如何接收请求的正文。 我得到错误: 如果他们甚至不把它放在他们的文件里,我怎么知道该怎么称呼它...

  • 问题内容: 我正在尝试访问Java Servlet过滤器中的两个http请求参数,这里没有新内容,但是很惊讶地发现这些参数已经被消耗了!因此,它在过滤器链中不再可用。 似乎只有在参数进入POST请求正文(例如表单提交)时才会发生这种情况。 有没有办法读取参数而不消耗它们? 问题答案: 顺便说一句,解决此问题的另一种方法是不使用筛选器链,而是使用可以在已解析请求主体上运行的方面来构建自己的拦截器组件

  • 我如何解析JSON请求之类的东西? 示例代码: 带有_名称的位置_为无