.net core读取Response.Body

打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

读取请求体流的demo
  1.         public static async Task<string> GetBodyForm(this HttpContext http)
  2.         {
  3.             var content = string.Empty;
  4.             var request = http.Request;
  5.             try
  6.             {
  7.                 request.Body.Position = 0;
  8.                 using var reader = new StreamReader(request.Body, Encoding.UTF8, leaveOpen: true);
  9.                 var strRequestBody = await reader.ReadToEndAsync();
  10.                 Console.WriteLine("ok");
  11.                 Console.WriteLine(strRequestBody == null ? "null" : strRequestBody);
  12.                 request.Body.Position = 0;
  13.             }
  14.             catch (Exception ex)
  15.             {
  16.                 Console.WriteLine("err");
  17.                 Console.WriteLine(ex);
  18.             }
  19.             return content;
  20.         }
复制代码
在ActionFilter中读取Request.Body
  1.     public class ActionFilterTestA : ActionFilterAttribute
  2.     {
  3.         public override async void OnActionExecuting(ActionExecutingContext context)
  4.         {
  5.             Console.WriteLine("From Request Body---->");
  6.             Console.WriteLine(await context.HttpContext.GetBodyForm());
  7.             Console.WriteLine("From Request Body---->");
  8.         }
  9.     }
复制代码
报错,一般是在Request.Body处报NotSupportedException
解决方案

在自定义中间件中调用EnableBuffering()
  1.     app.Use(async (context, next) =>
  2.     {
  3.         context.Request.EnableBuffering();
  4.         await next();
  5.     });
复制代码
疑问

(移除以上正确方案代码) 为什么在ActionFilterTestA中调用context.HttpContext.Request.EnableBuffering();没有效果?(没有报错,但是内容为空字符串)
猜测

请求体流在ActionFilter之前,在自定义中间件之后被消耗。 中间件执行顺序
测试
  1.     // 取消模型绑定
  2.     builder.Services.Configure<ApiBehaviorOptions>(options =>
  3.     {
  4.         options.SuppressInferBindingSourcesForParameters = true;
  5.     });
复制代码
Request.Body的内容打印成功。
推论

绑定模型时会消耗掉请求体流。
其他资料

https://markb.uk/asp-net-core-read-raw-request-body-as-string.html
结语

推荐还是通过中间件调用EnableBuffering解决问题
注意事项:


  • 避免关闭StreamReader导致关闭了Stream,可以通过leaveOpen: true解决
  • 重置Position = 0

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表