Почему connection.InvokeAsync вызывает обратный вызов, в то время как другие методы этого не делают? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть приложение .NET Core, которое использует концентраторы SignalR.

После выполнения некоторой бизнес-логики, mediator.Publish вызывается с некоторой полезной нагрузкой. Затем полезная нагрузка достигает диспетчера, который использует IHubContext для отправки соответствующего сообщения.

public class NotificationDispatcher : INotificationHandler<Notification>
{
    private readonly IHubContext<NotificationDispatcher> _hubContext;

    public NotificationDispatcher(IHubContext<NotificationDispatcher> hubContext)
    {
        _hubContext = hubContext;
    }

    public Task Handle(Notification notification, CancellationToken cancellationToken) =>
        _hubContext
            .Clients
            .All
            .SendAsync("Notify", notification, cancellationToken);
}

Код работает, но я хотел бы иметь интеграционные тесты для него.

Я использую Microsoft.AspNetCore.Mvc.Testing и создаю экземпляр соединения, как это

private static async Task<HubConnection> StartConnectionAsync(HttpMessageHandler handler, string hubName)
{
    var hubConnection = new HubConnectionBuilder()
        .WithUrl($"ws://localhost/{hubName}", o =>
        {
            o.HttpMessageHandlerFactory = _ => handler;
        })
        .Build();

    await hubConnection.StartAsync();

    return hubConnection;
}

затем, в целях подтверждения, я подписываюсь на событие "Уведомить", используя connection.On("Notify", notification => {}).

Затем я вызываю конечную точку, которая должна генерировать событие, используя WebApplicationFactory<Startup>

await factory.CreateClient().PostAsJsonAsync("/notify", notification);

Весь код «публикации событий» выполнен успешно (проверено через точки останова). Диспетчер вызывается с правильными аргументами, но обработчик, который передается внутрь connection.On, никогда не выполняется.

Если, однако, я добавлю Notify метод внутри самого концентратора:

public Task Notify(Notification notification) =>
    Clients
        .All
        .SendAsync(nameof(Notification), notification);

и затем вызовите connection.InvokeAsync("Notify", notification);, обработчик, переданный в connection.On, будет выполнен.

Ожидаемое

После вызова диспетчера выполняется обработчик, который передается внутрь connection.On.

Фактический

Обработчик, который передается внутрь connection.On, никогда не выполняется, если я не использую connection.Invoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...