我一直在 .NET 8 中试验 Blazor,并试图了解自动渲染模式的工作原理。据我所知,Blazor 最初在自动模式下使用 WebSocket 连接来通过服务器端渲染提供交互性。然后,当后台加载 WASM 资源时,它会切换到 WebAssembly (WASM)。
然而,在我的测试中,我注意到在 WASM 资源完全加载之前没有可用的交互性。在浏览器的网络选项卡中,我可以看到 WebSocket 连接,但 UI 似乎只是预渲染的,而不是交互式的。
我还了解到,要在 WASM 中渲染的组件应该放置在项目中ProjectName.Client
,并且这些组件不能设置为 WASM 之外的任何渲染模式(包括服务器模式)。但是,如果自动模式第一次要求组件通过 WebSocket 连接(就像我们在 Blazor Server 应用程序中那样)进行交互,那么如何将这些组件放置在项目中呢ProjectName.Client
?
在我的测试中,我启用了网络限制来模拟慢速网络,我发现自动模式的行为几乎与 WASM 渲染模式相同。两种模式都提供预渲染,但在加载 WASM 资源之前没有交互性,即使在自动模式下也是如此。
此外,我注意到,如果我在 WASM 和自动渲染模式下禁用预渲染,则在 WASM 资源完全加载之前,所有组件都不可见。这似乎与自动模式应尽快提供交互性的想法相矛盾。
我观看了Blazor 的创建者 Steve Sanderson 的YouTube 视频。视频中显示,当在自动模式下首次加载组件时,它会使用 WebSocket 连接进行渲染和交互。从第二次刷新开始,它通过 WebAssembly 加载。但是,我在测试中似乎没有观察到这种行为。
谁能澄清自动模式在 Blazor .NET 8 中应该如何工作?如果是 WASM,只是预渲染,那么它与 WASM 渲染模式有什么区别(因为所有交互式渲染模式默认都开启预渲染)?
我正在处理 Blazor 项目,其中组件的渲染模式设置为Auto
. 根据Blazor 文档,这意味着该组件最初是使用 Blazor 服务器托管模型在服务器端呈现并具有交互性。.NET 运行时和应用程序包在后台下载到客户端并缓存以供将来访问时使用。
以下是我的问题的一些背景信息:我有一个内部服务器 API,无法在服务器外部访问,也无法从客户端浏览器调用。我想在Auto
模式组件内调用该 API。如果它在服务器模式下运行,则调用将成功,因为它将起作用。但如果是 WebAssembly 模式,HTTP 请求将从客户端发送,客户端无法访问该 URL:
@page "/http"
@inject HttpClient Http
@rendermode InteractiveAuto
<h3>HTTP Response</h3>
<p>@_response</p>
@code {
private string _response = string.Empty;
protected override async Task OnInitializedAsync ()
{
var response = await Http.GetAsync ("http://api.internalhost");
_response = await response.Content.ReadAsStringAsync ();
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:当渲染模式设置为 时,如何在运行时确定组件是在 WebAssembly 还是服务器模式下渲染Auto
?
先感谢您!