.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
相关产品推荐
相关产品推荐

