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

