記項目升級到.NET 5.0后web api請求攔截器的完善
最近項目從.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一直為空,斷點body發(fā)現(xiàn)stream長度為0,自然是無法讀取到任何數(shù)據(jù)。在請求到達攔截器時Body已經(jīng)被讀取過了,此時在攔截器中使用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ù)了。