Swagger 请求 return 404 未找到

Requests for Swagger return 404 Not Found

这是 .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 重写,但是 none 我的重写规则适用于此(我什至完全注释掉了它,这并没有改变任何东西)。

我可以通过将端点更改为 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 中间件。

如有任何帮助,我们将不胜感激。

在您的 ConfigureServices() 方法中(也在 Startup.cs 中)您需要此代码来设置 Swagger 文档:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("{SWAGGER_VERSION}", new OpenApiInfo { Title = "{PROJECT_TITLE}", Version = "{SWAGGER_VERSION}" });
});

事实证明这实际上不是代码问题,而是配置问题。我是正确的;最近有一个变化导致了这个问题。这是上周首次部署,运行 在 IIS 中进行。因此,这需要一个 web.config 文件,我从我们的另一个网站复制了该文件。在该文件中,它拦截了对静态资产(图像、样式表、HTML 文件)的请求并直接从 IIS 为它们提供服务,这意味着 Swagger 中间件甚至没有接收到请求(这同样适用于 Elmah ).

<system.webServer>
    <handlers>
        <add name="StaticFileModuleHtml" path="*.html" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModuleHtm" path="*.htm" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModuleSvg" path="*.svg" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        <add name="StaticFileModuleJs" path="*.js" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
        [etc]

我只需要将它们注释掉,一切就恢复正常了。尤里卡时刻来自阅读 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-5.0#serve-files-from-multiple-locations 其中指出,“如果启用了 IIS 静态文件处理程序并且 ASP.NET 核心模块配置不正确,则会提供静态文件。”