如何检测客户端关闭了 Blazor 服务器端的浏览器(Web 套接字连接关闭)?

ale*_*_si 6 blazor blazor-server-side

我试图检测客户端何时与 Blazor 服务器端应用程序断开连接;这可能等于关闭了 Web 套接字连接。您能否建议一种在服务器端检测此类事件的方法?

ale*_*_si 7

我已经检查了 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 将处理以下事件:

  • OnCircuitOpenedAsync
  • OnConnectionUpAsync
  • OnConnectionDownAsync
  • OnCircuitClosedAsync

它还定义了 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/电路处理程序

  • 事实上 - IDisposable 仅检测用户离开页面(或应用程序)。如果我们在范围服务上使用 IDispose,则可以检测到用户已离开应用程序。我将更新解决方案。 (2认同)