最近在做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数据丢失的解决方案