Соединение с сигналом, получающим ошибку тайм-аута

#azure #.net-core #signalr

#azure #.net-ядро #signalr

Вопрос:

У меня есть моя служба SignalR, и я пытаюсь подключить ее к простому приложению .Net Core. При вызове браузера https://imubitsignalr.service.signalr.net:5001/client/negotiate?hub=usercount я получаю сообщение об ошибке ERR_CONNECTION_TIMED_OUT.

Чего мне не хватает?

Программа: index.cshtml

 <script type="text/javascript">
    document.addEventListener('DOMContentLoaded', function () {
        function bindConnectionMessage(connection) {
            var messageCallback = function (message) {
                console.log('message'   message);
                if (!message) return;
                var userCountSpan = document.getElementById('users');
                userCountSpan.innerText = message;
            };
            connection.on("updateCount", messageCallback);
            connection.onclose(onConnectionError);
        }
        function onConnected(connection) {
            console.log('connection started');
        }
        function onConnectionError(error) {
            if (error amp;amp; error.message) {
                console.error(error.message);
            }
        }
        var connection = new signalR.HubConnectionBuilder().withUrl('/chat').build();
        bindConnectionMessage(connection);
        connection.start()
            .then(function () {
                onConnected(connection);
            })
            .catch(function (error) {
                console.error(error.message);
            });
    });
</script>
  

В startup.cs я установил:

 services.AddSignalR(hubOptions => {
    hubOptions.EnableDetailedErrors = true;
    hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(3);
}).AddAzureSignalR();
  

код концентратора:

    public class UserCount : Hub
    {
        private static int Count;

        public override Task OnConnectedAsync()
        {
            Count  ;
            base.OnConnectedAsync();
            this.Clients.All.SendAsync("updateCount", Count);
            return Task.CompletedTask;
        }

        public override Task OnDisconnectedAsync(Exception exception)
        {
            Count--;
            base.OnDisconnectedAsync(exception);
            this.Clients.All.SendAsync("updateCount", Count);
            return Task.CompletedTask;
        }
    }

  

сопоставление концентратора:

      app.UseAzureSignalR(routes =>
                    {
                        routes.MapHub<UserCount>("/chat");
                    });
  

Комментарии:

1. Пожалуйста, добавьте код конфигурации вашего концентратора в серверную часть. Также я заметил, что вы пытаетесь подключиться hub=usercount , но в коде клиента, который у вас есть withUrl('/chat') , поэтому было бы важно увидеть пример кода конфигурации серверного концентратора.

2. @Kiril1512 Спасибо! Я добавил его. моя ошибка после установки времени ожидания `сбой: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404`

3. Добавьте код, который вы используете при запуске, для сопоставления концентратора.

4. @Kiril1512 теперь спасибо!

5. @Kiril1512 Теперь ты видишь проблему?

Ответ №1:

Убедитесь, что вы настроили свое веб-приложение, как в этом примере:

 public void Configure(IApplicationBuilder app, HostConfiguration hostConfiguration, ILogger<Startup> logger)
{
    base.Configure(app, hostConfiguration, logger);

    app.UseWebSockets();

    app.UseCors(CorsPolicy);

    app.UseAzureSignalR(routes =>
    {
        routes.MapHub<ChatHub>("/chat");
    });
}

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy(CorsPolicy, builder => builder.WithOrigins("https://localhost:4200")
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowCredentials()
            .SetIsOriginAllowed((host) => true));
    });
            
    services.AddSignalR().AddAzureSignalR(azureOptions =>
    {
        azureOptions.ConnectionString = "connectionSringHere";
    });
}
  

Комментарии:

1. Спасибо! с какой версией net core вы кодировали? Я с 2.1, и это немного сложно с Cors..

2. Мой веб-сокет все еще прослушивает мой локальный хост, а не SignalRAzure