首頁>技術>

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

10
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 位元組跳動前端技術面試分享