ASP.NET WebApi中间件问题:无法获取端点元数据与读取请求体
解决ASP.NET WebApi中间件的两个问题
一、Endpoint返回null的问题
原因
中间件注册顺序错误。EndpointRoutingMiddleware(对应代码里的app.UseRouting())负责完成路由匹配并设置Endpoint对象,如果你的PlausibilityMiddleware注册在UseRouting()之前,此时路由还未匹配,Endpoint自然为空。
解决方案
调整中间件注册顺序,确保PlausibilityMiddleware在app.UseRouting()之后、app.UseEndpoints()之前注册。示例配置代码:
var app = builder.Build(); // 其他中间件(如日志、CORS等)... app.UseRouting(); // 在这里注册你的自定义中间件 app.UseMiddleware<PlausibilityMiddleware>(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
二、读取请求体的正确方式
请求体流默认只能被读取一次,直接读取会导致后续控制器无法获取请求数据,需要先启用缓冲并重置流位置。
修改中间件的InvokeAsync方法,添加读取逻辑:
public async Task InvokeAsync(HttpContext context) { try { if (!CanProcess(context)) { await _next(context); return; } // 启用请求体缓冲,允许多次读取 context.Request.EnableBuffering(); // 读取请求体(以文本格式为例,JSON/表单数据通用) string requestBody; using (var reader = new StreamReader(context.Request.Body, leaveOpen: true)) { requestBody = await reader.ReadToEndAsync(); // 重置流位置,确保后续中间件/控制器能正常读取 context.Request.Body.Position = 0; } Log.Trace(requestBody); } catch (Exception ex) { Log.Error("Unknown error occured while validate pre import"); Log.Error(ex); } await _next(context); }
如果需要读取二进制类型的请求体,可替换为读取字节数组的方式,核心同样是启用缓冲并重置流位置。
内容的提问来源于stack exchange,提问作者Felix Arnold
相关产品推荐
相关产品推荐

