Marvin's Blog【程式人生】

Ability will never catch up with the demand for it

24 Jul 2021

Blazor文档阅读【一】

Introduction to ASP.NET Core Blazor

重要的一条:

  • Share server-side and client-side app logic written in .NET.
  • Leverage the existing .NET ecosystem of .NET libraries .

组件可以以Razor class libraries 或者NuGet包的形式分发。

因为是采用Razor模板来撰写页面,所以组件也就是Razor组件。

Blazor WebAssembly是一个[SPA应用框架(https://docs.microsoft.com/en-us/dotnet/architecture/modern-web-apps-azure/choose-between-traditional-web-and-single-page-apps)

WebAssembly 与JavaScript有良好的互操性。Blazor需要通过JavaScript来操作DOM和其他流浪其API。

编译WASM是Blazor会将无用的IL指令清除

Blazor Server的话,则是通过SingalR 进行通信。

SignalR是为实时通信优化的。

Blazor实现了.NET Standard ,后者是一个众多.NET实现的公共子集。若访问了无法在浏览器中调用的API,会触发PlatformNotSupportedException。

参考:

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

Categories