使用Blazor Server 线路处理程序 (circuit handler)跟踪打开的SignalR连接

Blazor服务器允许定义线路处理程序(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服务在处理期间引发未处理的异常,则框架记录该异常。

猜你喜欢

转载自www.cnblogs.com/bisslot/p/12435768.html
今日推荐