You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:48:10