如何访问 Blazor 服务器客户端的当前线路

2024-03-13

我正在开发一个使用 ASP.NET Core 的 Blazor Server 项目Identity。我正在尝试实现一个组件来管理当前的活动用户。我可以访问当前客户端的当前身份用户,但我似乎无法访问与当前客户端关联的电路,因为我想跟踪每个用户何时离开浏览器(电路已断开连接)。

来自“@enet”的回答(link https://stackoverflow.com/questions/59999763/how-can-i-invoke-method-in-circuithandler-of-blazor-server-side),我尝试实施CircuitHandler,我可以得到当前所有的电路,但是我怎么知道哪个电路与哪个用户关联呢?

using Microsoft.AspNetCore.Components.Server.Circuits;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;

namespace BlazorCircuitHandler.Services
{
    public class CircuitHandlerService : CircuitHandler
    {
        public ConcurrentDictionary<string, Circuit> Circuits { get; set; }
        public event EventHandler CircuitsChanged;

        protected virtual void OnCircuitsChanged()
            => CircuitsChanged?.Invoke(this, EventArgs.Empty);

        public CircuitHandlerService()
        {
             Circuits = new ConcurrentDictionary<string, Circuit>();
        }

        public override Task OnCircuitOpenedAsync(Circuit circuit, 
                             CancellationToken cancellationToken)
        {
            Circuits[circuit.Id] = circuit;
            OnCircuitsChanged();
            return base.OnCircuitOpenedAsync(circuit, cancellationToken);
        }

        public override Task OnCircuitClosedAsync(Circuit circuit, 
                             CancellationToken cancellationToken)
        {
            Circuit circuitRemoved;
            Circuits.TryRemove(circuit.Id, out circuitRemoved);
            OnCircuitsChanged();
            return base.OnCircuitClosedAsync(circuit, cancellationToken);
        }

        public override Task OnConnectionDownAsync(Circuit circuit, 
                             CancellationToken cancellationToken)
        {
            return base.OnConnectionDownAsync(circuit, cancellationToken);
        }

        public override Task OnConnectionUpAsync(Circuit circuit, 
                             CancellationToken cancellationToken)
        {
            return base.OnConnectionUpAsync(circuit, cancellationToken);
        }
    }
}

如果您使用 AddHttpContextAccessor 服务

services.AddHttpContextAccessor();

您可以在创建电路时获取用户:

public class MyCircuitIdStashingHandler: CircuitHandler
{
    public override Task OnCircuitOpenedAsync(Circuit circuit, CancellationToken cancellationToken)
    {
        IHttpContextAccessor accessor = new HttpContextAccessor();
        accessor.HttpContext.User.Identity; // store in dictionary somewhere
        return base.OnCircuitOpenedAsync(circuit, cancellationToken);
    }
}

...然后您可以跟踪哪些用户正在使用哪个电路

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问 Blazor 服务器客户端的当前线路 的相关文章

随机推荐