最近项目从.net core 2.1直接晋级到.net 5.0,发现很多代码需求改动,其中就触及到原来的web api央求阻拦器的中Body数据的读取。
原来的是这样写的:
if (filterContext.HttpContext.Request.Body.CanSeek)
{
filterContext.HttpContext.Request.EnableBuffering();
StreamReader fStreamReader = new StreamReader(filterContext.HttpContext.Request.Body);
fStreamReader.BaseStream.Position = 0;
var fBodyData = fStreamReader.ReadToEnd();
fStreamReader.BaseStream.Position = 0;
}
fBodyData不断为空,断点body发现stream长度为0,自然是无法读取就任何数据。在央求抵达阻拦器时Body曾经被读取过了,此时在阻拦器中运用EnableBuffering并没有起作用。也是奇异,.net core 2.1还好好的,怎样突然就不行了。查了些材料,可以经过在Startup中添加如下代码处置:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//省略其他代码
app.Use(next => context =>
{
context.Request.EnableBuffering();//启动倒带方式
return next(context);
});
//省略其他代码
}
而阻拦器里则可以去掉EnableBuffering的调用了
if (filterContext.HttpContext.Request.Body.CanSeek)
{
filterContext.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(filterContext.HttpContext.Request.Body);
var fBodyData = reader.ReadToEndAsync().Result;
filterContext.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin);
}
测试了下,日志中终于又可以读取到body数据了。
(责任编辑:admin)