記專案升級到.NET 5.0後web api請求攔截器的完善

最近專案從。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資料了。

記專案升級到.NET 5.0後web api請求攔截器的完善

有什麼技術問題,歡迎私聊溝通。

如需要攔截器原始碼,請評論本貼後私聊獲取。[奸笑]