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

时间:2020-05-28 20:16:47

标签: asp.net-core iis blazor webassembly

在开发过程中,我在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,而不是通过服务器。我将使用开发工具调试更多内容,并打开提琴手进行尝试,将其报告。

2 个答案:

答案 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",
            }));
}

这对我们来说很好。

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