【发布时间】:2021-06-16 20:10:27
【问题描述】:
这是 .NET Core 3.1 上的 ASP.NET MVC 应用程序,带有 Swashbuckle.AspNetCore 6.1.4(最新)。当我尝试在/swagger/index.html 加载 Swagger UI 时,我收到 404。似乎 Swagger 中间件没有处理请求,而是转而使用静态文件中间件。令人气愤的是,这曾经可以正常工作,但我无法弄清楚我最近所做的哪些更改会导致此问题。
我的 Startup.cs 文件有这个(相当标准):
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.RoutePrefix = "swagger";
options.SwaggerEndpoint($"{SWAGGER_VERSION}/swagger.json", "My API");
options.EnableDeepLinking();
});
app.UseStaticFiles();
当我注意到 404 发生时,我尝试在浏览器中加载 JSON 文件,但得到了 IIS Express 404 页面,这有点奇怪。即使HTTP请求是针对swagger.json,错误页面显示:
Requested URL: https://localhost:44316/wwwroot/swagger/v1/swagger.js
Physical path: C:\Users\hcheng\source\repos\[xxx]\src\[xxx.yyyy]\wwwroot\swagger\v1\swagger.js
于是 IIS 更改了文件扩展名,然后试图在 wwwroot 文件夹中找到一个不存在的 Javascript 文件。请注意,我也有 URL 重写,但我的重写规则都不适用于这里(我什至将其完全注释掉,这并没有改变任何东西)。
我可以通过将端点更改为swaggerjson 来解决这个问题,效果很好。但是,这并没有解决 index.html 的 404。对于这个,它是类似的:
Requested URL: https://localhost:44316/wwwroot/swagger/index.html
Physical path: C:\Users\hcheng\source\repos\[xxx]\src\[xxx.yyyy]\wwwroot\swagger\index.html
我在管道中添加了一些虚拟中间件,如下所示:
app.UseSwagger(); // options omitted
app.UseSwaggerUI(); // options omitted
app.Use(async (context, next) => await next()); // breakpoint here
app.UseStaticFiles();
app.Use(async (context, next) => await next()); // breakpoint here
现在,当我尝试加载 /swagger/index.html 时,我遇到了第一个断点,但没有遇到第二个,这证实了我的理论,即 Swagger 中间件没有处理请求,而是由静态文件处理。
更新:当我遇到这些断点时,请求实际上是针对favicon.ico; /swagger/index/html 的请求根本没有命中这些,这意味着 IIS 在这里完全绕过了 ASP.NET。
我真的不知道我做了什么让这不起作用。这种行为最初是在我安装 Swashbuckle 5.6.3 时开始的,但即使在升级到 6.1.4 后仍然存在。
这个问题也扩展到了我的 ElmahCore 实现,这表明它可能是一个更大的问题。对于 Elmah,CSS 和 JS 请求也是 404,同样,处理这些请求的是静态文件中间件,而不是 Elmah 中间件。
任何帮助将不胜感激。
【问题讨论】:
标签: c# swagger swagger-ui asp.net-core-3.1