【问题标题】:URL Rewrite exceptions for Blazor WebAssembly Hosted deploymentBlazor WebAssembly 托管部署的 URL 重写异常
【发布时间】:2020-09-16 07:16:44
【问题描述】:

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

我们已经在 IIS 下部署在我们的 pre-prod 服务器上,服务器端和 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,而不是通过服务器发送。我将使用开发工具进行更多调试,并打开 fiddler 以尝试解决问题,并将报告回来。

【问题讨论】:

    标签: asp.net-core iis blazor webassembly


    【解决方案1】:

    原来这是已发布的 service-worker.js 文件的一部分。它在开发中与发布的不同(这是有道理的)。

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

    一旦 service-worker 运行,它就会处理来自 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);
    }
    

    只需按照代码 cmets 中的说明进行操作即可解决问题。所以我们最终像这样为“/swagger”添加了一个排除项:

    && !event.request.url.includes('/swagger')
    

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

    【讨论】:

      【解决方案2】:

      您的 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

      【讨论】:

      • 是的,当然。当我直接从 Kestrel (dotnet MyDll.server.dll) 运行我的应用程序时,Swagger 工作,但当我托管在 IIS 上时它不起作用,因为它试图在我的 Blazor 应用程序“内部”路由 /swagger,寻找一个响应“/swagger”而不是直接进入招摇页面的组件。这就是为什么我要谈论 URL 重写,这是目前(对我而言)唯一合乎逻辑的解释。
      • 我正在导航到 mydomain/swagger(没有 index.html),但如果我添加 index.html,也会发生同样的情况。今天早上发生了一件有趣的事情,我去了 mydomain/swagger,swagger 出现了!之后,在 Firefox 中使用相同的选项卡,我删除了 /swagger,进入了我的 Blazor wasm 站点,然后重新输入 /swagger 并无法进入 swagger,我留在了 blazor wasm 中,并显示“对不起,这个地址没有任何内容。”信息。我在 Chrome 中尝试了同样的方法,它实际上在 Chrome 中按预期工作......所以我认为 aspnet core/blazor/rewrite 方面的事情是好的,这可能是一个 Firefox 的“错误”。
      • 发布了我的问题的答案,详细说明了如何指定重写/服务的例外情况。我很好奇,彼得,你真的有一个 Blazor WebAssembly “托管部署”(即服务器和客户端托管在同一个 IIS 站点上)在 IIS 上运行并且在运行 WebAssembly 应用程序之后毫无问题地提供服务(它是服务人员)?我的意思是,它记录在 service-worker.published.js 中,这有点告诉我,一旦 serviceworker 运行,预计使用 /swagger 是行不通的。然而你报告它“工作得很好”。
      • 最后的注释:对我来说是关键(将/index.html 添加到招摇路径)
      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2020-05-25
      相关资源
      最近更新 更多