Клиент основной консоли SignalR не получает уведомления

Я просмотрел некоторые из похожих вопросов и не понял этой проблемы. У меня есть простой концентратор в моем проекте веб-API ядра.NET. Вот хаб:

 public class NotificationHub : Hub<INotificationClient>
{
  public async Task SendMessage(string user, string msg)
    {
        await Clients.All.ReceiveMessage(user, msg);
    }
    public Task SendMessageToCaller(string msg)
    {
        return Clients.Caller.ReceiveMessage(msg);
    }

    public Task SendMessageToPartner(string user, string msg)
    {
        return Clients.Client(user).ReceiveMessageToPartner(msg);
    }
}

Вот интерфейс:

 public interface INotificationClient
{
    Task ReceiveMessage(string user, string msg);
    Task ReceiveMessage(string msg);
    Task ReceiveMessageToPartner( string msg);

}

Вот код контроллера:

[Route("[controller]")]
[ApiController]
public class NotificationsController : ControllerBase
{
    private IHubContext<NotificationHub> _hub;

    public NotificationsController(IHubContext<NotificationHub> hub)
    {
        _hub = hub;

    }
    [HttpGet]
    public async Task<IActionResult> Get()
    {
        var msg = new NotificationData { ClientId = "12345", Notification = "Somone just connected" };
        await _hub.Clients.All.SendAsync("Notification", msg);
        return Ok(new { Message = "Request complete" });
    }
}

Наконец, вот код клиента консоли:

 Console.WriteLine("Press a key to start listening");
        Console.ReadKey();

        Console.WriteLine("Client Listening!");
        var connection = new HubConnectionBuilder()
           .WithUrl("http://localhost:61514/notifications")

           .Build();


        connection.On<NotificationData>("Notification", (notificationData) =>
            Console.WriteLine($"Somebody connected: {notificationData.ClientId}"));

        connection.StartAsync().GetAwaiter().GetResult();

        Console.WriteLine("Listening. Press a key to quit");
        Console.ReadKey();

Вот запуск веб-приложения с сопоставлениями:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR();
        services.AddControllers();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<NotificationHub>("/Notifications");
        });
    }

Я продолжаю получать эту ошибку: System.IO.IOException: "Сервер отключен до того, как можно было начать рукопожатие". Я, должно быть, что-то упускаю по пути.

Обновление:
включил логи и получил эту ошибку:

dbug: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[8] Установление соединения с сервером по адресу " http://localhost:61514/notifications". dbug: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[9] Установлено соединение "BdROAEEQnGUeDYAW5EspRA" с сервером. dbug: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[7] Запуск транспорта ServerSentEvents с URL: http://localhost:61514/notifications. информация: Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[1] Запуск транспорта. Режим передачи: Текст. dbug: Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[3] Запуск цикла приема. dbug: Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[9] Получено 30 байт. Разбор фрейма SSE. dbug: Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[4] Цикл приема остановлен. dbug: Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[100] Запуск цикла отправки. dbug: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[18] Транспорт "ServerSentEvents" запущен. dbug: Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[102] Цикл отправки отменен. dbug: Microsoft.AspNetCore.Http.Connections.Client.Internal.ServerSentEventsTransport[101] Цикл отправки остановлен. Необработанное исключение. информация: Microsoft.AspNetCore.Http.Connections.Client.HttpConnection[3] HttpConnection запущен. информация: Microsoft.AspNetCore.SignalR.Client.HubConnection[24] Использование HubProtocol 'json v1'. System.IO.IOException: сервер отключился до того, как можно было начать рукопожатие. в Microsoft.AspNetCore.SignalR.Client.HubConnection.HandshakeAsync (ConnectionState startConnectionState, CancellationToken cancellationToken) в Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncCore (CancellationToken cancellation.AncellationToken.StartAsyncCore (CancellationToken cancellationToken) в Microsoft.AspNetCore.SignalR.Client.HubConnection.StartAsyncInner (CancellationToken cancellationToken) в System.Threading.Tasks.ForceAsyncAwaiter.GetResient.Tasks.ForceAsyncAwaiter.GetResient. NotificationClient.Program.Main(String[] args)

1 ответ

Решение

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

Конечная точка концентратора указывала на контроллер. Поэтому, когда клиент устанавливал соединение, он дважды ударил по контроллеру, заставив сервер закрыть соединение. Итак, я изменил эту строку:

app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<NotificationHub>("/Notify");
        });

от "/Notifications", который поражал контроллер, до "Notify", как в приведенном выше коде, перенаправил клиента с Notifications на Notify.

 var connection = new HubConnectionBuilder()
           .WithUrl("http://localhost:61514/Notify")
          .ConfigureLogging(logging =>
          {
              logging.AddConsole();
              logging.SetMinimumLevel(LogLevel.Debug);
          })
           .Build();

и сообщения начали поступать.

Другие вопросы по тегам