ale*_*_si 6 blazor blazor-server-side
我试图检测客户端何时与 Blazor 服务器端应用程序断开连接;这可能等于关闭了 Web 套接字连接。您能否建议一种在服务器端检测此类事件的方法?
我已经检查了 ASP.NET Core 3.1 功能并测试了当用户离开组件或浏览器关闭时确实可以检测到事件。
检测用户何时离开组件或组件何时被丢弃,但无法辨别这是由于单击应用程序中的链接还是仅仅因为导航到不同的 URL 或关闭浏览器窗口:
AddressBase.razor.cs:
public class AddressBase : ComponentBase, IDisposable
{
void IDisposable.Dispose()
{
Console.WriteLine("Disposing AddressBase.");
}
}
Run Code Online (Sandbox Code Playgroud)
地址.razor:
@page "/address"
@inherits AddressBase
<h1>Address component</h1>
Run Code Online (Sandbox Code Playgroud)
当浏览器窗口关闭或当用户导航到应用程序中的不同视图或完全不同的 URL 时,将为当前显示在页面上的所有组件触发 Dispose() 函数。
检测用户是否真的离开了应用程序:
Blazor 使用 Blazor 电路来维护有关用户和范围服务的信息。电路具有生命周期事件,并且可以为它们注册事件处理程序。为此,请扩展 CircuitHandler 类并使用 DI 注册它。CircuitHandler 将处理以下事件:
它还定义了 Order 属性,该属性可用于多个 CircuitHandler 的执行排序。
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Server.Circuits;
public class TrackingCircuitHandler : CircuitHandler
{
private HashSet<Circuit> circuits = new HashSet<Circuit>();
public override Task OnConnectionUpAsync(Circuit circuit,
CancellationToken cancellationToken)
{
circuits.Add(circuit);
return Task.CompletedTask;
}
public override Task OnConnectionDownAsync(Circuit circuit,
CancellationToken cancellationToken)
{
circuits.Remove(circuit);
return Task.CompletedTask;
}
public int ConnectedCircuits => circuits.Count;
}
// ...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<CircuitHandler, TrackingCircuitHandler>();
}
Run Code Online (Sandbox Code Playgroud)
https://docs.microsoft.com/en-us/aspnet/core/blazor/advanced-scenarios?view=aspnetcore-3.1 https://source.dot.net/#Microsoft.AspNetCore.Components.Server/Circuits/电路处理程序
归档时间: |
|
查看次数: |
3868 次 |
最近记录: |