Introduction to ASP.NET Core Blazor
went over gain.
Tooling for ASP.NET Core Blazor
Visual Studio 2019支持
- Visual Studio 2019安装ASP.NET and web development工作部。
- 创建Blazor App,可选
- Blazor WebAssembly App
- Blazor Server App
默认需要HTTPS,参考Enforce HTTPS in ASP.NET Core。
Visual Studio Code支持通过.NET CLI来创建项目:
dotnet new blazorwasm -h
dotnet new blazorserver -h
ASP.NET Core Blazor hosting models
Blazor WebAssembly
和UI进程在一起执行。内容可静态发布。
同样可以通过SignalR与后端通信,参考Use ASP.NET Core SignalR with Blazor。
框架提供blazor.webassembly.js,用于处理:
- 下载.NET运行库,应用,以及应用的依赖
- 初始化运行库并执行应用。
限制:
- 应用受限于浏览器能力
- 应用受限于客户端软硬件能力
- 下载尺寸偏大,加载时间拉长
- .NET运行库和工具支持尚不成熟,特别是调试支持
支持Docker部署。
Blazor Server
传统CS模式,Blazor运行在服务端,客户端只有一个小代理,通过SingalR与服务端通信。
框架提供blazor.server.js用于搭建SignalR连接。
限制:
- 迟延偏高
- 没有脱机支持
- 对于多用户的应用,服务端要维护多个客户端连接,扩展性受挑战
- 必须使用ASP.NET Core作为服务端,不支持Serverless部署,即通过CDN部署。
同样支持Docker部署。
Comparison to server-rendered UI
传统的ASP.NET也支持服务端UI渲染,同样采用Razor视图或者Razor页面。区别在于Razor代码中的标签如何被渲染。
渲染页面或者视图时,Razor代码中的每一行都会释出HTML文本。渲染结束后,服务端丢弃渲染时用的页面和视图例现。只有再来一个请求时,才会重新例现化,并更新整个页面。
对于Blazor,其标的是组件。服务端维护一个组件网,包含各个组件间的关系。通过对组件网的求职,产生对标签的二进制表示,可以用于:
- (在预渲染时)转化成HTML文本(也就是首次发送内容之前)
- 用于更新既有标签
触发UI更新的操作:
- 用户交互事件
- 应用事件触发,比如计时器
会计算出一个UI diff用于更新DOM。
组件在客户端呈现的时候,服务端必须保持该组件的状态。这个需要一些谨慎处理:Threat mitigation guidance for ASP.NET Core Blazor Server。
Circuits
因为客户端需要受服务端管控,Blazor通过SignalR搭建闭路线(circuit)用于管控。同样的应用在浏览器中每打开一次就要为之建立闭路线。
正常情况下,当浏览器退出或者跳到别的网页,闭路线就会关停。但是在异常情况下,客户端无推出提示,服务端会保持闭路线状态一段时间再释放。
UI Latency
远端管控会增加操作迟延自不必说,过度内存使用导致的C垃圾回收或者内存页写入硬盘也会增加迟延。
Connection to the server
客户端在连接段了之后会主动再次连接服务端。只要状态还在,服务端就可以直接恢复管控。
采用多后端服务器的应用应该为SignalR连接实现sticky sesson。
Azure提供可扩展的SignalR服务。IIS则需要打开 Application Request Routing,参考HTTP Load Balancing using Application Request Routing。