【发布时间】:2020-05-16 21:06:39
【问题描述】:
我正在通过 Blazor 服务器端制作聊天室应用程序。我想展示每个用户的在线状态。
我问了一个问题,关于如何在关闭How can I get the event while page close in blazor server-side? 中的页面时获取事件
现在看来CircuitHandler 是最好的选择。
当用户关闭页面时,我想在数据库中设置一个用户状态从在线到离线。而且,每个用户的主键都暂时存储在index.razor中。
但是现在OnCircuitClosedAsync(Circuit, CancellationToken)运行后,我不知道如何调用方法来实现这一点(我无法获取Blazor前端的变量或调用前端的Blazor方法)。
PS: 下面是后端的代码:
using Microsoft.AspNetCore.Components.Server.Circuits;
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 CircuitHandlerService()
{
Circuits = new ConcurrentDictionary<string, Circuit>();
}
public override Task OnCircuitOpenedAsync(Circuit circuit, CancellationToken cancellationToken)
{
Circuits[circuit.Id] = circuit;
return base.OnCircuitOpenedAsync(circuit, cancellationToken);
}
public override Task OnCircuitClosedAsync(Circuit circuit, CancellationToken cancellationToken)
{
Circuit circuitRemoved;
Circuits.TryRemove(circuit.Id, out circuitRemoved);
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);
}
}
}
这里是前端:
@page "/"
@using Microsoft.AspNetCore.Components.Server.Circuits
@inject CircuitHandler CircuitHandlerService
<h1>Hello, world!</h1>
Welcome to your new app.
<p>
Number of Circuits: @((CircuitHandlerService as BlazorCircuitHandler.Services.CircuitHandlerService).Circuits.Count)
<ul>
@foreach (var circuit in (CircuitHandlerService as BlazorCircuitHandler.Services.CircuitHandlerService).Circuits)
{
<li>@circuit.Key</li>
}
</ul>
@{
var PrimaryKey = "abcdefg";
}
</p>
你能帮帮我吗?谢谢。
【问题讨论】:
标签: c# asp.net-core .net-core blazor blazor-server-side