Я делаю приложение для чата на стороне сервера Blazor. Я хочу показать состояние каждого пользователя в сети.
Я задал вопрос о том, как получить событие при закрытии страницы в Как я могу получить событие, когда страница закрывается в Blazor на стороне сервера ?
Теперь кажется, что 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>
Не могли бы вы мне помочь? Спасибо.