使用Blazor Server 线路处理程序 (circuit handler)跟踪打开的SignalR连接
bisslot 人气:2Blazor服务器允许定义线路处理程序(circuit handler)代码,该处理程序(handler)允许在更改用户线路状态时运行此代码。 线路处理程序(circuit handler)是通过从CircuitHandler类派生并在应用程序的服务容器中注册该类来实现的。
以下线路处理程序(circuit handler)示例跟踪打开的SignalR连接:
1 using System.Collections.Generic; 2 using System.Threading; 3 using System.Threading.Tasks; 4 using Microsoft.AspNetCore.Components.Server.Circuits; 5 6 public class TrackingCircuitHandler : CircuitHandler 7 { 8 private HashSet<Circuit> _circuits = new HashSet<Circuit>(); 9 10 public override Task OnConnectionUpAsync(Circuit circuit, 11 CancellationToken cancellationToken) 12 { 13 _circuits.Add(circuit); 14 15 return Task.CompletedTask; 16 } 17 18 public override Task OnConnectionDownAsync(Circuit circuit, 19 CancellationToken cancellationToken) 20 { 21 _circuits.Remove(circuit); 22 23 return Task.CompletedTask; 24 } 25 26 public int ConnectedCircuits => _circuits.Count; 27 }
线路处理程序使用DI (依赖注入) 注册。 每个线路实例都会创建作用域实例。 在前面的示例中使用TrackingCircuitHandler来创建单例服务,因为必须跟踪所有电路的状态:
1 public void ConfigureServices(IServiceCollection services) 2 { 3 ... 4 services.AddSingleton<CircuitHandler, TrackingCircuitHandler>(); 5 }
如果自定义线路处理程序(circuit handler)的方法抛出未处理的异常,则该异常对于Blazor Server线路是致命的。 要容忍处理程序代码或被调用方法中的异常,请使用错误处理和日志记录将代码包装在一个或多个try-catch语句中。
当由于用户断开连接而线路结束并且框架正在清除线路状态时,框架将处理线路的DI(依赖注入)范围。 处置范围处置任何实现System.IDisposable的线路范围的DI服务。 如果有任何DI服务在处理期间引发未处理的异常,则框架记录该异常。
加载全部内容