想象一下这段代码:
@page "/"
@code{
string name;
string greet;
}
@{
void sayhello()
{
greet = $"Hello, {name}";
}
}
<span>Type your name : </span>
<input Type="Text" @bind="name" />
<br/>
<button @onclick="sayhello">Say hello!</button>
<hr/>
<h1>@greet</h1>
Run Code Online (Sandbox Code Playgroud)
这段代码将获取用户的名字并向用户问好。但它是如何运作的呢?这是真的?
在 Blazor WebAssembly 中,它像客户端计算机中的 ac# 独立程序一样运行。但在 BlazorServer 中,它执行相同的操作,但在服务器中而不是在客户端计算机中,并使用 SignalR 将更新的 UI 发送到客户端。
小智 6
正如您所说,Blazor 可以以两种方式运行:服务器端或客户端。
当它在客户端时,就像浏览器中的 JavaScript 一样。当页面加载时,代码被下载到客户端计算机上。当您单击按钮时,它在浏览器内运行,无需联系服务器。
运行服务器端 Blazor 时,客户端发生的任何事情都会从浏览器发送到服务器进行处理,然后发送回显示。
此服务器/客户端事务发生的级别与大多数 Web 框架略有不同。
如果我们看看三个不同的级别或服务器渲染:
带有 HTML 响应的表单提交。当客户端提交请求时,服务器返回 HTML 供浏览器渲染,所有数据都已内联在 HTML 中。这就是 ASP.Net MVC、PHP 和各种其他服务器端技术传统上的工作方式。此方法通常会针对页面上的每次点击通过 HTTP 传输完整的页面。
对 API 的 AJAX/XHR 请求。该页面首先加载 HTML 和 JavaScript。当您单击页面上的按钮时,它会向服务器发送请求,服务器仅响应所需的数据,然后显示数据。此方法通常在加载时传输大量标记,然后仅在必要时传输数据。这是 Blazor WASM/客户端和单页应用程序框架 (SPA) 中使用的模型。
在 Blazor 服务器中,客户端和服务器之间有一个(接近)连续的来回连接,用户所做的每次点击都会在客户端和服务器之间来回传输,而不是每次发送完整的 HTML 页面或数据,只是更新页面时进行了最小的更改。这种情况发生在 SignalR 上,但也可能发生在 Http 或其他协议上,SignalR 只是被选为实时数据传输的有效协议。
正如@Crowcoder和@Adyson提到的,SignalR是一种抽象,主要使用websockets,有时也使用HTTP或其他技术。Microsoft 提供这种抽象主要是因为 WebSocket 快速且高效,但编码起来令人不快且不稳定。SignalR 将其包装在易于使用的 API 中,而不是每个人都必须编写必要的代码才能安全地使用 WebSocket。客户端和服务器之间的 Blazor 链接是使用该抽象构建的。
这三种情况并不难快速除法。这三个层次经常混合在一起,并且有很多如果、但是以及位于边界某处的场景。然而,它们是常见场景,有助于了解这两种类型的 Blazor 在 Web 框架领域的位置。