为什么 Blazor 的索引中有 <base href= "/" />.html或 _Host.razor 文件?



在每个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。

最新更新