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

.NET Core 6 MVC路由前处理带空格请求头解决400错误求助

解决方案:修正非法请求头以适配.NET 6 MVC

方案一:自定义前置中间件修正请求头

.NET 6对HTTP请求头的格式校验比旧版ASP.NET Web Forms更严格,带空格的头字段名会被Kestrel服务器直接判定为非法并返回400错误——这个错误发生在MVC路由、ActionFilter执行之前,因此必须在请求管道的更早阶段处理。

可以编写自定义中间件,在请求进入MVC管道前遍历并修正所有带空格的请求头字段名:

public class FixInvalidHeadersMiddleware
{
    private readonly RequestDelegate _next;

    public FixInvalidHeadersMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var correctedHeaders = new HeaderDictionary();
        // 遍历原始请求头,清理字段名中的空格
        foreach (var header in context.Request.Headers)
        {
            var cleanedName = header.Key.Replace(" ", string.Empty);
            correctedHeaders[cleanedName] = header.Value;
        }

        // 替换原始请求头集合
        context.Request.Headers.Clear();
        foreach (var header in correctedHeaders)
        {
            context.Request.Headers[header.Key] = header.Value;
        }

        // 传递请求到后续中间件
        await _next(context);
    }
}

// 扩展方法方便注册中间件
public static class FixInvalidHeadersMiddlewareExtensions
{
    public static IApplicationBuilder UseFixInvalidHeaders(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<FixInvalidHeadersMiddleware>();
    }
}

在Program.cs中,将该中间件注册在MVC路由中间件之前:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var app = builder.Build();

// 必须放在UseRouting之前执行
app.UseFixInvalidHeaders();

app.UseRouting();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

此方案会将Accept-Charset : ISO-8859-1修正为符合HTTP规范的Accept-Charset: ISO-8859-1,彻底解决400错误。

方案二:禁用严格请求头校验(不推荐)

若不想修改请求头,可尝试通过配置降低.NET 6的请求头校验强度,但此方案会削弱安全性,仅建议在测试环境临时使用:

builder.Services.Configure<KestrelServerOptions>(options =>
{
    options.AllowSynchronousIO = true;
    // 禁用部分严格校验规则
    options.AddServerHeader = false;
});

注意:该方案无法保证完全解决问题,Kestrel底层仍可能对部分非法格式的请求头抛出错误,因此优先推荐方案一。

内容的提问来源于stack exchange,提问作者Xavier Casals

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:27:30