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

.NET 6中Swagger UI的index.html无法触发自定义中间件求助

问题解决:自定义中间件在SwaggerUI根路径访问时未触发

核心原因

中间件的注册顺序导致了这个问题:.UseSwaggerUI() 在 .UseLoggingMiddleware() 之前注册,当访问根路径的 /index.html 时,SwaggerUI的中间件会直接匹配并处理请求,不会调用后续的中间件(也就是你的LoggingMiddleware),因此响应头不会被修改。而访问 /swagger/index.html 时,请求会先经过你的中间件,再被Swagger处理,所以方法会触发。

解决方案

调整中间件注册顺序,把自定义的 UseLoggingMiddleware() 放在 .UseSwagger() 和 .UseSwaggerUI() 之前:

// Program.cs   
// 先注册自定义中间件
app.UseLoggingMiddleware();

// 再注册Swagger相关中间件
app.UseSwagger();
app.UseSwaggerUI(setupAction =>
{
    setupAction.RoutePrefix = string.Empty;
});
...

原理说明

.NET中间件管道是按注册顺序依次执行的:

  • 先注册的中间件会先接收到请求,处理后再调用 _next(context) 传递给下一个中间件。
  • 如果某个中间件没有调用 _next(context),后续中间件就不会被执行。
    SwaggerUI的中间件在匹配到根路径请求时,直接生成并返回Swagger页面的响应,不会继续传递请求,所以必须让你的自定义中间件先执行,才能在响应头中添加CSP。

额外验证

修改顺序后,访问 /index.html 时,你的 InvokeAsync 方法会先被触发,添加CSP头,然后请求才会被SwaggerUI中间件处理,最终返回的响应头中就会包含你设置的Content-Security-Policy。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:42:05