Код: Выделить всё
@page "/test"
@using System.Diagnostics
@using Microsoft.AspNetCore.SignalR.Client
@rendermode InteractiveServer
@implements IAsyncDisposable
Test
Send Message
@foreach(var m in _messages)
{
@m
}
@code {
private readonly List _messages = [];
private HubConnection? _hubConnection;
protected override async Task OnInitializedAsync()
{
_hubConnection = new HubConnectionBuilder()
.WithUrl("http://localhost:5200/message")
.WithAutomaticReconnect()
.Build();
_hubConnection.On("OnMessage", GetMessage);
await _hubConnection.StartAsync();
await base.OnInitializedAsync();
}
private void GetMessage(string message)
{
_messages.Add(message);
Debug.WriteLine(message);
InvokeAsync(StateHasChanged);
}
public async ValueTask DisposeAsync()
{
if (_hubConnection is not null)
{
_hubConnection.Remove("OnMessage");
await _hubConnection.StopAsync();
await _hubConnection.DisposeAsync();
}
}
private async Task SendMessage()
{
await _hubConnection.SendAsync("SendMessage", "Hello");
}
}
На сервере я просто пересылаю сообщение сообщения всем клиентам
Код: Выделить всё
public async Task SendMessage(string message)
{
await Clients.All.SendAsync("OnMessage", message);
}
Когда я открываю страницу и нажимаю кнопку «Отправить», сообщение отображается один раз на моей странице и один раз в окне вывода.
Но если я обновлю страницу и нажму еще раз, сообщение отобразится один раз на моей странице. но дважды в моем окне вывода, как будто первый прослушиватель событий все еще зарегистрирован, хотя он должен был быть удален, не так ли?
Если вы отслеживаете текущую цепь и поместив это в выходные данные, вы увидите, что функция GetMessage вызывается из обеих цепей (до и после обновления) (я не включил это в код, чтобы упростить его).
Обработчик событий размещается неправильно? как это вообще может работать, когда соединение с хабом закрыто и удалено? что я здесь неправильно понимаю?
Подробнее здесь: https://stackoverflow.com/questions/787 ... ad-of-page