Состояние подключения к узлу связи SignalR = подключение

#c# #xamarin #server #signalr #signalr-hub

Вопрос:

Я пытаюсь создать сервер SignalR с помощью клиента Xamarin. Каждый раз, когда я пытаюсь подключиться к серверу, статус просто «подключается» без изменений. Попытался обойти сертификат с помощью кода, который я нашел в Интернете, но это не решает проблему. И когда я пытаюсь зайти на сайт-концентратор (ip:порт/уведомитель), я получаю сообщение «Требуется идентификатор подключения».

Сторона клиента:

 public class SignalRService : ISignalRService
    {
        private readonly HubConnection hubConnection;

        public SignalRService()
        {
            hubConnection = new HubConnectionBuilder()
                .WithUrl("https://ip:5001/notifier", options => {
                    options.HttpMessageHandlerFactory = factory => new HttpClientHandler
                    {
                        ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }
                    };
                })
                .WithAutomaticReconnect()
                .Build();
        }

        public void /*async Task*/ Connect()
        {
            hubConnection.StartAsync();
            var a = hubConnection.State;
            while (hubConnection.State == HubConnectionState.Connecting) //for debug purposes
            {
                continue;
            }
            a = hubConnection.State;    
        }
 

На стороне сервера

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

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapHub<NotifyHub>("/notifier");
            });
        }

Thanks for any help! 
 

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

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

2. @Джейсон, Это достижимо. когда я пытаюсь связаться с ним с помощью браузера на эмуляторе, он показывает, что соединение не является частным, но оно доступно.

3. @Jason и добавлено правило для порта в брандмауэре (надеюсь, правильно)

Ответ №1:

Итак, наконец-то я нашел решение!

проблема заключалась в том, что эмулятор не мог подключиться к локальному хосту через http://localhost:port но с ip «10.0.2.2:порт»

и по какой-то причине реализовать SignalR для клиента как сервис не сработало…