.NET Core 6中NuGet包内HttpContext中间件报Not Supported错误解决方法
解决.NET Core 6中间件NuGet包中读取请求体的“Not Supported”错误
问题根源在于:context.Request.Body在部分宿主环境(如IIS、生产级Kestrel配置)中是不可查找的流,直接设置Position = 0会触发NotSupportedException。本地调试时的开发服务器流支持查找,因此不会报错,但打包为NuGet包部署到其他环境后就会暴露问题。
修复方案
通过将请求流复制到可查找的内存流中,替代原始流后再操作,具体代码修改如下:
public async Task InvokeAsync(HttpContext context) { var originalBody = context.Request.Body; try { // 创建可查找的内存流,复制原始请求流内容 using var memoryStream = new MemoryStream(); await context.Request.Body.CopyToAsync(memoryStream); memoryStream.Position = 0; // 读取并记录请求体 var requestReader = new StreamReader(memoryStream); var requestContent = await requestReader.ReadToEndAsync(); LogContext("HTTP Request", requestContent); // 重置内存流位置,确保后续中间件能正常读取 memoryStream.Position = 0; context.Request.Body = memoryStream; // 调用后续中间件 await _next(context); } finally { // 恢复原始请求流(可选,视场景决定是否保留) context.Request.Body = originalBody; } }
额外注意事项
- 若请求体体积较大,使用内存流可能导致内存占用过高,此时可改用临时文件流(
FileStream)替代,但需注意及时清理临时文件 - 也可在目标API应用的
Program.cs中添加app.UseRequestBodyRewind()启用内置的请求体缓存,但自行处理流的方式兼容性更强,不受宿主配置影响
内容的提问来源于stack exchange,提问作者Michael Witt
相关产品推荐
相关产品推荐

