記項(xiàng)目升級到.NET 5.0后web api請求攔截器的完善
最近項(xiàng)目從.net core 2.1直接升級到.net 5.0,發(fā)現(xiàn)很多代碼需要改動,其中就涉及到原來的web api請求攔截器的中Body數(shù)據(jù)的讀取。
原來的是這樣寫的:
- 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一直為空,斷點(diǎn)body發(fā)現(xiàn)stream長度為0,自然是無法讀取到任何數(shù)據(jù)。在請求到達(dá)攔截器時(shí)Body已經(jīng)被讀取過了,此時(shí)在攔截器中使用EnableBuffering并沒有起作用。也是奇怪,.net core 2.1還好好的,怎么突然就不行了。查了些資料,可以通過在Startup中添加如下代碼解決:
- public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 - {
 - //省略其他代碼
 - app.Use(next => context =>
 - {
 - context.Request.EnableBuffering();//啟動倒帶方式
 - return next(context);
 - });
 - //省略其他代碼
 - }
 
而攔截器里則可以去掉EnableBuffering的調(diào)用了
- 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數(shù)據(jù)了。
















 
 
 









 
 
 
 