asp.net-core - Blazor WebAssembly 托管部署的 URL 重写异常
问题描述
在开发过程中,我在 Blazor WebAssembly 应用程序的服务器端使用了 Swagger。始终使用 kestrel 而不是 IIS Express 启动(调试)。路由按预期工作,我的所有组件都正确路由,如果我手动输入 /swagger,我会进入 swagger 页面。都好。
我们已经在我们的 pre-prod 服务器上部署在 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,而不是通过服务器发送。我将使用开发工具进行更多调试,并打开 fiddler 以尝试解决,并将报告回来。
解决方案
原来这是已发布的 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);
}
只需按照代码注释中的说明进行操作即可解决问题。所以我们最终为“/swagger”添加了一个排除项,如下所示:
&& !event.request.url.includes('/swagger')
希望这篇文章对那些想要在服务工作者之外提供服务的人有用,而不仅仅是 Swagger。
推荐阅读
- java - 基于表单的 weblogic 身份验证登录问题
- twitter-bootstrap - Bootstrap 4 网格 - 3 列 - 5.5 - 1 - 5.5
- ionic-framework - 离子定制键盘
- python - 在 Python 中调用相对路径
- nginx - 从 Gitlab 触发 Jenkins 作业不起作用
- python - 什么 Python 语法规则允许句点和方法调用之间有空格?
- javascript - Slack API 在不更改用户文本的情况下向用户消息添加附件
- mysql - MySQL 为 WebDAV 请求生成睡眠查询
- javascript - 如何使用jquery在控制台中将ul li值转换为数组格式
- jquery - 引导选项卡:将 NGL 查看器加载到选项卡中