Blazor WebAssembly 托管部署的 URL 重写例外



在开发过程中,我在Blazor WebAssembly应用程序的服务器端使用了Swagger。 路由按预期工作,我的所有组件都正确路由,如果我手动键入/swagger,我就会进入招摇页面。都很好。

我们已经在预生产服务器上的 IIS 下部署,服务器端和 Blazor WebAssembly 应用(客户端(按预期工作并且可用,但是,我的/swagger url 被重写(我假设(去我的应用程序中的某个地方,而不是让它去 Swagger,显然没有任何组件可以回答/swagger。

我唯一的猜测是,当托管在 IIS 上时,aspnet 核心应用程序负责告诉 IIS 要重写的内容以及如何重写(类似于可以通过 web.config 为"独立"部署提供的配置(。

我找不到如何指定例外,我一直在关注文档 https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/blazor/webassembly?view=aspnetcore-3.1#iis

知道我如何为/swagger 添加例外吗?

编辑:

事实证明,它在Chrome中可以正常工作,只有Firefox具有不需要的行为。如果我清除缓存或使用隐身模式,Firefox 中不会发生此问题。因此,Firefox似乎缓存了一些东西,并尝试将我的URL输入发送到Blazor Wasm,而不是通过服务器。我将使用开发工具和小提琴手打开以尝试弄清楚它,并会报告更多。

事实证明,这是已发布的服务工作者.js文件的一部分。它在开发中与发布的内容不同(这是有道理的(。

在调试期间,我能够在所有浏览器(Edge,Chrome和Firefox(上重现该问题,无论是否处于隐身/私人模式。

服务辅助角色运行后,它将处理来自 Blazor WebAssembly 应用 cache/index.html 的请求。

如果你进入 Blazor WebAssembly Client "wwwroot"文件夹,你会发现一个 service-worker 和一个 service-worker.publish.js.js。在 service-worker.publish.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。

你的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",
}));
}

这对我们来说效果很好。

注意:您必须导航到 https://yourdomain/swagger/index.html

最新更新