在每个Blazor项目中,index.html
或_Host.razor
内部都有一个<base href="/">
(取决于您使用的是Blazor WebAssembly还是Blazor Server(。
现在,我知道了这个标记的作用,简单地说,放在它的href
属性中的任何值都将被预先添加到HTML文档中的每个相对路径中。
然而,我不明白为什么每个Blazor项目都默认使用它。例如,如果您正在使用Blazor WebAssembly,则在index.html
文件的末尾有以下行:
<script src="_framework/blazor.webassembly.js"></script>
很明显,在该路径的开头没有/
,因为文档中存在<base href="/" />
,但为什么他们不能简单地向该路径添加一个前导/
,从而完全消除对base
标记的需要?!为什么要添加基本标签?!
我还尝试手动删除<base href="/" />
标记,并在所有路径中添加了一个前导/
,但很快我发现这样做会导致问题:如果你有一个页面的路径像/counter/something
(超过两个级别(,那么blazor.webassembly.js
文件在加载后会动态地将其他所需的JS文件和程序集添加到HTML页面,添加它们时不带前导斜杠,并且基本上假设有<base href="/" />
。
例如,blazor.webassembly.js
加载具有该路径的文件"_framework/blazor.boot.json";。但在像我刚才解释的场景中,这将导致404错误,因为这是一个相对路径,并且没有"错误"/counter/framework/blazor.boot.json";。
因此,这基本上意味着在每个Blazor应用程序中都必须具有<base href="/" />
!但是为什么?!
从这里开始
应用程序基本路径是应用程序的根URL路径。考虑以下内容ASP.NET Core应用程序和Blazor子应用程序:
- ASP.NET Core应用程序名为MyApp:
- 应用程序物理驻留在d:/MyApp
- 请求接收于https://www.contoso.com/{MYAPP资源}
- 名为CoolApp的Blazor应用程序是MyApp的子应用程序:
- 子应用程序物理上位于d:/MyApp/CoolApp
- 请求接收于https://www.contoso.com/CoolApp/{coolap资源}
如果不为CoolApp指定额外的配置,则此场景中的子应用程序不知道它在服务器上的位置。例如,应用程序无法在不知道其位于相对URL路径CoolApp/的情况下构造与其资源的正确相对URL。