首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Blazor WebAssembly托管部署的URL重写例外

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

Stack Overflow用户
提问于 2020-05-29 04:16:47
回答 2查看 1.3K关注 0票数 1

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

我们已经在我们的预生产服务器上部署了IIS,服务器端和Blazor应用程序(客户端)按预期工作并可用,然而,我的/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,而不是通过服务器。我会用dev工具和fiddler打开调试更多,试着弄清楚,我会报告的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-29 22:20:43

事实证明,这是发布的service-worker.js文件的一部分。它在dev中与发布的内容不同(这是有意义的)。

在我的调试过程中,我能够在所有浏览器(Edge,Chrome和Firefox)上重现这个问题,无论是否处于隐身/隐私模式。

一旦服务工作者开始运行,它就会处理来自Blazor WebAssembly应用程序的缓存/索引.html的服务请求。

如果你进入Blazor "wwwroot“文件夹,你会发现一个WebAssembly -worker.js和一个服务-worker.Published.js。在service-worker.published.js中,您将发现一个如下所示的函数:

代码语言:javascript
复制
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“添加了一个排除项,如下所示:

代码语言:javascript
复制
&& !event.request.url.includes('/swagger')

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

票数 4
EN

Stack Overflow用户

发布于 2020-05-29 05:08:46

您的Startup.Configure方法中是否有UseSwagger first?

代码语言:javascript
复制
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseSwagger();
    app.UseSwaggerUI(c =>
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "YourAppName V1")
    );

Startup.ConfigureServices中,我把Swagger代码放在最后。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62073764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档