欢迎光临
我们一直在努力

.net core 3.0 在滤过器FilterAttribute中获取Request.Body的值(亲测原创分享)

最近在做net core 3.0 weapi的项目,有时候前端调用接口时总是验证不通过,就想获取一下传进的来的body信息到底是什么。

网上找了好多。感觉整理的都不齐全,要么不是core的 ,要么不是Filter筛选器的。

经过我的整理会总并记录方便以后查阅,也希望帮到大家。

废话不说,代码如下

第一步:修改Startup中的Configure方法如下截图

代码如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            Common.AppSettings.SetAppSetting(Configuration.GetSection("AppSettings"));

            app.UseHttpsRedirection();

            app.UseRouting();
            app.Use(next => context =>
            {
                context.Request.EnableBuffering();
                return next(context);
            });

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

异常处理:  app.Use时 EnableBuffering 报错,出现HttpRequest”未包含“EnableBuffering”的定义

 

第二步:创建Filter类。创建一个类命名“CheckTokenFilter”(名字随意起)

注:一定要继承ActionFilterAttribute 如下图

第三步:添加获取request.body的代码

public override void OnActionExecuting(ActionExecutingContext context)
        {
            context.HttpContext.Request.Body.Position = 0;
            string bodyStr = string.Empty;
            using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8, true, 1024, true))
            {
                var bodyRead = reader.ReadToEndAsync();
                bodyStr = bodyRead.Result;  //把body赋值给bodyStr
            }
 base.OnActionExecuting(context);
        }

好了,处理结束。整理不容易。方便话给一个免费的赞。

 

2020-05-23更新 最新方案

我最近还写了另一种实现方案,通过中间件拦截Request.body和Response的返回值

发现用中间件比较好。

因为中间件执行顺序是早于过滤器的,可以修改json中某个数据类型

比如:int64类型在微信小程序、js、node.js中最后两位可能是0, 所以需要修改返回值的类型为字符串类型。

下面附上另外两篇文章的地址

.net core 3.0 通过中间件拦截或获取Request.Body、Response的返回值

微信小程序js调用.net core webapi 返回值中有雪花算法int64类型ID数据丢失的解决方案

 

赞(6)
未经允许不得转载:自游互动 » .net core 3.0 在滤过器FilterAttribute中获取Request.Body的值(亲测原创分享)
分享到: 更多 (0)

自由技术,自由自在

项目合作联系我们