【发布时间】:2019-12-04 05:01:44
【问题描述】:
我有一个简单的 Blazor 网站 (source code),在 Azure Devops 的 iframe 中运行时出现路由问题,但在其他地方没有。
应用程序在以下条件下运行时可以正常工作
- 使用“F5”在我的 PC 上使用 Visual Studio (VS2019) 在本地
- 使用 Visual Studio 的“发布”功能将项目发布到光盘后作为静态站点在本地进行
- 在本地作为另一个不相关网站的 iframe 中的静态网站
- 将发布的网站上传到主机后远程作为托管静态网站
- 远程作为另一个不相关站点的 iframe 中的静态站点(第二个静态站点模仿 AzureDevOps 板,使用不同的主机名)
但是,当我生成 Azure Devops widget 并将其上传到 Visual Studio Marketplace 时,Blazor 路由失败,因此站点无法正确加载,如此屏幕截图所示。
可以在here 找到该站点的源代码(只不过是默认 VS Blazor 模板的简化版本)。
观察
- 所有与 blazor 相关的资产(即 Blazor 和 mono javascript 文件以及各种 DLL 文件)都已成功提供给浏览器
- blazor DLL 运行成功(即
Programs.cs成功启动 -Program.cs和StartUp.cs中的Console.WriteLine语句证明了这一点) - blazor 未能成功找到默认路由,因此
<NotFoundContent>(在App.razor中定义)标签显示在Azure Devops iframe 中
我尝试解决的问题
- 在
wwwroot\index.html中将base href定义为“/” - 在
wwwroot\index.html中将base href定义为“/dist” - 使用
[Route]属性在index.cs文件中定义路由 - 在运行时使用 javascript 在
wwwroot\index.html中动态定义base href(这可满足 Microsoft 对 iframe 父 URL 的任何更改)
注意事项
- 所有Azure Devops widgets 在Azure Devops 内的iframe 中运行。
- 上传到 Visual Studio Marketplace can be found here 的 vsix 文件。
【问题讨论】:
-
您不能找出您的应用正在接收哪个 URL 吗?它正在运行。
-
如果我正确理解您的评论,您的意思是 iframe 的父 URL - 我使用 javascript 动态识别该 URL(请参阅 code here)。但是这个问题只发生在 Azure DevOps 中——当为 iframe 父级使用不同的站点时,我的应用程序工作得很好。
-
我注意到你在内容加载后写你的
base href,什么时候base href应该是head部分的一部分?这有什么不同吗? -
@Jamie 很确定在
body中设置base href没有任何区别(令人惊讶)。当我将body中的base href设置为错误值(例如“foobar”)时,资产无法下载,但当设置为正确值时,资产会下载。即使将head中的base href设置为我确信正确的值也会失败:-( -
我还向 Azure Devops 团队 here 提出了这个问题,因为目前它似乎更多地以 Azure Devops 为中心而不是以 Blazor 为中心。
标签: azure-devops widget vsix blazor