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