找不到SWAGGER RETURN 404请求 [英] Requests for Swagger return 404 Not Found

查看:46
本文介绍了找不到SWAGGER RETURN 404请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个基于.NET Core 3.1的ASP.NET MVC应用程序,安装了Swashuckle.AspNetCore 6.1.4(最新版本)。当我尝试在/swagger/index.html加载Swagger用户界面时,得到的是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:Usershchengsource
epos[xxx]src[xxx.yyyy]wwwrootswaggerv1swagger.js
因此IIS更改了文件扩展名,然后尝试在wwwroot文件夹中查找不存在的Java脚本文件。请注意,我也可以重写URL,但我的重写规则在这里都不适用(我甚至将其完全注释掉,这并没有改变任何事情)。

我能够通过将端点更改为swaggerjson来解决这个问题,这样可以很好地工作。但是,这并不能解决index.html的404。对于这个,它是类似的:

Requested URL: https://localhost:44316/wwwroot/swagger/index.html
Physical path: C:Usershchengsource
epos[xxx]src[xxx.yyyy]wwwrootswaggerindex.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。

我真的不知道我做了什么让这件事不起作用。这一行为最初是在我安装Swashbakle 5.6.3时开始的,但即使在升级到6.1.4之后也会出现这种情况。

这个问题也扩展到我的ElmahCore实现,这表明它可能是一个更大的问题。对于Elmah,CSS和JS请求也是404,同样,处理这些请求的是静态文件中间件,而不是Elmah中间件。

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

推荐答案

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

这篇关于找不到SWAGGER RETURN 404请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆