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