这是一个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中间件。
任何帮助都将不胜感激。
3条答案
按热度按时间fnatzsnv1#
事实证明,这实际上不是代码问题,而是配置问题。有一个最近的变化导致了这个问题。这个问题是上周第一次部署的,在IIS的进程内运行。因此,这需要一个web.config文件,我从我们的另一个网站复制了这个文件。在这个文件中,它拦截了对静态资产的请求(图像、样式表、HTML文件),并直接从IIS提供这些文件,因此这意味着Swagger中间件甚至没有接收请求(Elmah也是如此)。
我只需要把这些注解掉,一切就恢复正常了。Eureka 的时刻来自于阅读https://learn.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-5.0#serve-files-from-multiple-locations,其中声明,“如果启用了IIS静态文件处理程序,并且ASP.NET核心模块配置不正确,则会提供静态文件。”
5t7ly7z52#
在您的
ConfigureServices()
方法中(也在Startup.cs中),您需要以下代码来设置Swagger文档:9cbw7uwe3#
此外,我在部署到IIS时遇到了一个问题,当生成Swagger文件夹时,生成了一个Web.config,这导致了我的页面中的错误。
web.config是由我的主机提供商生成的。如果有人不知道是什么问题,请检查web.config是否在swagger或index.html文件夹中。