在开发过程中,我在Blazor WebAssembly应用程序的服务器端使用了Swagger。始终使用kestrel而不是IIS Express启动(调试)。 路由按预期方式工作,我的所有组件都正确路由,如果我手动键入/ swagger,我就进入了swagger页面。一切都很好。
我们已经在预生产型服务器上的IIS下部署了服务器端和Blazor WebAssembly应用程序(客户端),它们可以按预期工作并且可以正常使用,但是,/ swagger URL被重写(我假设)以放置在应用程序中与其让它进入Swagger,显然没有任何组件可以响应/ swagger。
我唯一的猜测是,当托管在IIS上时,aspnet核心应用程序会告诉IIS重写什么以及如何重写(类似于可以通过web.config为“独立”部署提供的配置。)
我找不到如何指定例外,我一直在关注文档 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/blazor/webassembly?view=aspnetcore-3.1#iis
有什么想法可以为/ swagger添加一个例外吗?
编辑:
结果证明它可以在Chrome中正常运行,只有Firefox出现了不良行为。如果我清除缓存或使用隐身模式,则Firefox中不会发生此问题。因此,似乎Firefox缓存了一些东西,并尝试将我的URL输入发送到Blazor Wasm,而不是通过服务器。我将使用开发工具调试更多内容,并打开提琴手进行尝试,将其报告。
答案 0 :(得分:2)
结果证明,这是已发布的service-worker.js文件的一部分。开发与发布的内容有所不同(这很有意义)。
在调试期间,无论是否处于隐身/私人模式,我都能在所有浏览器(Edge,Chrome和Firefox)上重现该问题。
服务工作人员运行后,它将处理Blazor WebAssembly应用程序的cache / index.html中的服务请求。
如果进入Blazor WebAssembly客户端“ wwwroot”文件夹,则将找到service-worker.js和service-worker.published.js。在service-worker.published.js中,您将找到一个类似于以下内容的函数:
async function onFetch(event) {
let cachedResponse = null;
if (event.request.method === 'GET') {
// For all navigation requests, try to serve index.html from cache
// If you need some URLs to be server-rendered, edit the following check to exclude those URLs
const shouldServeIndexHtml = event.request.mode === 'navigate'
&& !event.request.url.includes('/connect/')
&& !event.request.url.includes('/Identity/');
const request = shouldServeIndexHtml ? 'index.html' : event.request;
const cache = await caches.open(cacheName);
cachedResponse = await cache.match(request);
}
return cachedResponse || fetch(event.request);
}
只需按照代码注释中的说明进行操作即可解决此问题。因此,我们最终为“ / swagger”添加了一个排除项,如下所示:
&& !event.request.url.includes('/swagger')
希望这篇文章对那些想在服务工作者之外服务的人有用,不仅仅是Swagger。
答案 1 :(得分:1)
您的Startup.Configure
方法中是否首先使用UseSwagger?
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseSwagger();
app.UseSwaggerUI(c =>
c.SwaggerEndpoint("/swagger/v1/swagger.json", "YourAppName V1")
);
在Startup.ConfigureServices
中,我最后是Swagger代码。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSwaggerGen(c =>
c.SwaggerDoc(
name: "v1",
info: new OpenApiInfo
{
Title = "YourAppName",
Version = "V1",
}));
}
这对我们来说很好。