【问题标题】:Requests for Swagger return 404 Not Found对 Swagger 的请求返回 404 Not Found
【发布时间】: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


    【解决方案1】:

    事实证明,这实际上不是代码问题,而是配置问题。我是对的;最近有一个变化导致了这个问题。这在上周首次部署,在 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 Core 模块配置不正确,则会提供静态文件。”

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我确实有。我只是没有包括它,因为我不想让这个问题太长。再说一遍,Swagger 直到最近都运行良好,所以我一定做了一些事情让它停止工作。
      猜你喜欢
      • 1970-01-01
      • 2021-02-07
      • 2023-03-05
      • 2020-03-16
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2021-03-31
      相关资源
      最近更新 更多