问题描述
这是一个基于.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请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!