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

Car*_*ion 1 iis webassembly asp.net-core blazor

在开发过程中,我在 Blazor WebAssembly 应用程序的服务器端使用了 Swagger。始终使用 kestrel 而不是 IIS Express 启动(调试)。路由按预期工作,我的所有组件都正确路由,如果我手动输入 /swagger,我就会进入 swagger 页面。都好。

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

我唯一的猜测是,当托管在 IIS 上时,aspnet core 应用程序负责告诉 IIS 重写什么以及如何重写(类似于可以通过 web.config 提供的“独立”部署的配置。)

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

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

编辑:

事实证明,它在 Chrome 中运行没有问题,只有 Firefox 出现了不需要的行为。如果我清除缓存或使用隐身模式,则 Firefox 中不会出现此问题。因此,Firefox 似乎缓存了一些内容,并尝试将我的 URL 输入发送到 Blazor Wasm,而不是通过服务器。我将使用开发工具和打开的 fiddler 进行更多调试,尝试找出答案,然后进行报告。

Car*_*ion 5

事实证明,这是已发布的 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);
}
Run Code Online (Sandbox Code Playgroud)

只需按照代码注释中的说明进行操作即可解决问题。所以我们最终添加了“/swagger”的排除项,如下所示:

&& !event.request.url.includes('/swagger')
Run Code Online (Sandbox Code Playgroud)

希望这篇文章对那些想要在 Service Worker 之外提供服务的人有用,而不仅仅是 Swagger。