swagger 404 Not Found-页面没有找到

yquaqz18  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(163)

这是一个ASP .NETMVC应用程序,运行在.NET核心3.1上,带有Swashbuckle。(最新)。当我尝试在/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中间件没有处理请求,而是静态文件在处理请求。
UPDATE:当我遇到这些断点时,请求实际上是favicon.ico;对/swagger/index/html请求根本不会命中这些对象,这意味着IIS在这里完全绕过了ASP.NET。
我真的不知道我做了什么使它不能工作。这个行为最初开始时,我有Swashbuckle 5.6.3安装,但这仍然存在,即使在升级到6.1.4。
这个问题也扩展到了我的ElmahCore实现中,这表明这可能是一个更大的问题。对于Elmah,CSS和JS请求也是404,同样,是静态文件中间件处理这些请求,而不是Elmah中间件。
任何帮助都将不胜感激。

fnatzsnv

fnatzsnv1#

事实证明,这实际上不是代码问题,而是配置问题。有一个最近的变化导致了这个问题。这个问题是上周第一次部署的,在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]

我只需要把这些注解掉,一切就恢复正常了。Eureka 的时刻来自于阅读https://learn.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-5.0#serve-files-from-multiple-locations,其中声明,“如果启用了IIS静态文件处理程序,并且ASP.NET核心模块配置不正确,则会提供静态文件。”

5t7ly7z5

5t7ly7z52#

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

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

9cbw7uwe3#

此外,我在部署到IIS时遇到了一个问题,当生成Swagger文件夹时,生成了一个Web.config,这导致了我的页面中的错误。
web.config是由我的主机提供商生成的。如果有人不知道是什么问题,请检查web.config是否在swagger或index.html文件夹中。

相关问题