首页 > 其他分享 >.net core读取Response.Body

.net core读取Response.Body

时间:2023-10-08 17:15:08浏览次数:43  
标签:Body core Console context request Request WriteLine net

读取请求体流的demo
        public static async Task<string> GetBodyForm(this HttpContext http)
        {
            var content = string.Empty;
            var request = http.Request;

            try
            {
                request.Body.Position = 0;

                using var reader = new StreamReader(request.Body, Encoding.UTF8, leaveOpen: true);
                var strRequestBody = await reader.ReadToEndAsync();
                Console.WriteLine("ok");
                Console.WriteLine(strRequestBody == null ? "null" : strRequestBody);
                request.Body.Position = 0;
            }
            catch (Exception ex)
            {
                Console.WriteLine("err");
                Console.WriteLine(ex);
            }
            return content;
        }

在ActionFilter中读取Request.Body

    public class ActionFilterTestA : ActionFilterAttribute
    {
        public override async void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine("From Request Body---->");
            Console.WriteLine(await context.HttpContext.GetBodyForm());
            Console.WriteLine("From Request Body---->");
        }
    }

报错,一般是在Request.Body处报NotSupportedException

解决方案

在自定义中间件中调用EnableBuffering()

    app.Use(async (context, next) =>
    {
        context.Request.EnableBuffering();
        await next();
    });

疑问

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

猜测

请求体流在ActionFilter之前,在自定义中间件之后被消耗。 中间件执行顺序

测试

    // 取消模型绑定
    builder.Services.Configure<ApiBehaviorOptions>(options =>
    {
        options.SuppressInferBindingSourcesForParameters = true;
    });

Request.Body的内容打印成功。

推论

绑定模型时会消耗掉请求体流。

其他资料

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

结语

推荐还是通过中间件调用EnableBuffering解决问题

注意事项:

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

标签:Body,core,Console,context,request,Request,WriteLine,net
From: https://www.cnblogs.com/sigeer0-o/p/17749267.html

相关文章

  • Kubernetes 部署 Python Flask 项目
    1、编写源代码及Dockerfiletest.pyfromflaskimportFlaskimportsocketapp=Flask(__name__)@app.route('/')defhello():returnsocket.gethostbyname(socket.gethostname())if__name__=='__main__':app.run(host='0.0.0.0......
  • ControlNet-trt优化总结3:使用multi-stream和cuda-graph构建并行流水线
    ControlNet-trt优化总结3:使用multi-stream和cuda-graph构建并行流水线上节谈到使用TRT-API来构建网络,在这一节中总结一些trick来提升模型的运行效率,这些trick在所有的trt优化中均可使用,主要有以下几点:使用cuda_graph减少kernel间的启动间隙使用Mutil-stream增加异步cuda_gra......
  • kubernetes基础排错
    目录删除ping不通pod的IP要查看Kubernetes集群是否正常运行,可以执行以下操作:集群节点状态检查:运行以下命令检查集群中所有节点的状态:CopyCodekubectlgetnodes输出将显示集群中每个节点的名称、状态和相关信息。确保所有节点都处于正常的Ready状态。POD状态检查:......
  • kubernetes 持久化存储
    目录kubernetes持久化存储k8s存储介绍特地对象存储本地存储网络共享存储EmptyDir类型hostPath类型type类型说明持久化存储PV和PVCPV和PVC生命周期PV和PVC需要注意的地方pv资源清单PVC资源清单POD要挂载PVCwordpress完整综合实践mysqlwordpressmysql主从复制实......
  • NetCore Ocelot 之 Rate Limiting
    Ocelotsupportsratelimitingofupstreamrequestssothatyourdownstreamservicesdonotbecomeoverloaded.OKsotogetratelimitingworkingforaRouteyouneedtoaddthefollowingjsontoit."RateLimitOptions":{"ClientWhi......
  • Telnet 明文密码抓取实验
    Telnet明文密码抓取实验实验准备:本机作为客户端、winserver2008为服务端、wireshark抓包工具实验步骤:1.在本机开启telnet客户端功能​ 打开控制面板——>程序——>启用或关闭windows功能————勾选telnet客户端2.开启winserver2008服务端功能​ 右键计算机选择管理......
  • harbor登录时报错error parsing HTTP 404 response body: invalid character
    **harbor登录时报如下错误: **[root@localhostTDFW-publish-tar]#dockerlogin--username=user1192.168.2.10:8090--passworduser1_passWARNING!Using--passwordviatheCLIisinsecure.Use--password-stdin.Errorresponsefromdaemon:Get"http://192.168.2.......
  • .net6 webapi 项目注册为windows 服务后访问静态文件
    直接使用kestrel运行程序时,只需要http://localhost:port/file.html即可访问,但是将程序注册为windows服务后,http://localhost:port/file.html会报404的错误,此时要访问到这个文件,http://localhost:port/wwwroot/file.html才行,如果想要windows服务和web的url一致只需要加......
  • .Net7自定义GC垃圾回收器
    1.前言CLR和GC高度耦合,.Net7里面分离CLR和GC,则比较容易实现这件事情。本篇来看下,自定义一个GC垃圾回收器。2.概述这里首先演示下自定义GC垃圾回收后的效果。1.下载Custom.dll2.找到当前.Net目录,比如这里的7.0.10C:\ProgramFiles\dotnet\shared\Microsoft.NETCore.App\7.0.1......
  • EFCore 使用FluntApi配置 全局查询筛选器
    我们在类中通常会有一个属性为IsDel来表示软删除或也称逻辑删除,这个属性会导致我们在进行查询操作时,每一次都要.where(s=>s.IsDel==false)非常的麻烦。在使用efCore时可用通过配置查询筛选器来很好的解决这个问题。publicclassSysUser{publiclongId{get;set;}publi......