Медленное начало подключения SignalR Hub

Мой вопрос: Есть ли способ ускорить начальное подключение к хабу?

Подробности:

Я использую SignalR в собственной веб-службе @Win 8.1. У приложения Hub есть локальные клиенты и удаленные клиенты.

Я увеличил доступ к SignalR через DNS, localhost и 127.0.0.1 следующим образом:

'netsh http add urlacl url=http://<Replace>:<Port>/ user=Everyone'

Обычно все клиенты, даже локальные, используют DNS. И это работает.

Моя проблема - один порожденный дочерний процесс (с использованием С# Microsoft.AspNet.SignalR.Client.HubConnection). Обычно он подключается в течение 400 мс. Все нормально. Но иногда это занимает секунды.

Я попытался переключиться на этом клиенте на 127.0.0.1 и локальный хост, но без каких-либо изменений.

После первоначального подключения SignalR работает довольно быстро.

Если нет простого способа, я должен вернуться к обычному UDP.

Конфигурация SignalR в концентраторе:

using System;
using System.Web.Http;
using Microsoft.Owin;
using Microsoft.Owin.Cors;
using Microsoft.Owin.FileSystems;
using Microsoft.Owin.StaticFiles;
using Owin;

[assembly: OwinStartup(typeof(SignalRStartUp))]
namespace Onsite
{
    public class SignalRStartUp
    {
        // Any connection or hub wire up and configuration should go here
        public void Configuration(IAppBuilder pApp)
        {
            try
            {
                pApp.UseCors(CorsOptions.AllowAll);
                pApp.MapSignalR();
                pApp.UseFileServer(true);

                var lOptions = new StaticFileOptions
                {
                    ContentTypeProvider = new CustomContentTypeProvider(),
                    FileSystem = new PhysicalFileSystem(Constants.Root)
                };

                pApp.UseStaticFiles(lOptions);

                // Configure Web API for self-host. 
                var lConfig = new HttpConfiguration();
                lConfig.Routes.MapHttpRoute("RemoteApi", "api/{controller}/{action}");
                lConfig.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional });
                pApp.UseWebApi(lConfig); 
            }
            catch (Exception lEx)
            {
                Logger.Error(lEx);
            }
        }
    }
}

Запуск на клиенте:

public static string GetConnectionString(string pHost = null)
{
    var lHost = pHost ?? GetMainClientDns();
    return string.Format("http://{0}{1}", lHost, SignalRPort);
}

private void StartSignalR()
{
    try
    {
        var lConnectionString = GetConnectionString("127.0.0.1");

        var lStopWatch = new Stopwatch();
        lStopWatch.Restart();
        IsConnectingHost = true;

        _connection = new HubConnection(lConnectionString, string.Format("AccessKey={0}&Role={0}", Constants.AccessKeyPlugIn));
        _connection.Reconnected += SetConnected;
        _connection.Reconnecting += SetDisConnected;

        MTalkHub = _connection.CreateHubProxy("OnsiteHub");

        MTalkHub.On("RequestSetNext", RequestSetNext);
        MTalkHub.On("RequestSetPrevious", RequestSetPrevious);
        MTalkHub.On("RequestEcho", RequestEcho);

        _connection.TransportConnectTimeout = _transportConnectTimeout;

        var lTask = _connection.Start();
        lTask.Wait();

        lStopWatch.Stop();

        SetConnected();
     }
    catch (TargetInvocationException lEx)
    {
        IsDisconnected = true;
        Task.Run(() => TryToConnect());
        Logger.Fatal(string.Format("Server failed to start. Already running on: '{0}'", lConnectionString), lEx);
    }
    catch (Exception lEx)
    {
        IsDisconnected = true;
        Task.Run(() => TryToConnect());
        Logger.Fatal(string.Format("Connecting to: '{0}' failed!", lConnectionString.ToStringNs()));
    }
    finally
    {
        IsConnectingHost = false;
    }
}

person user2029101    schedule 10.09.2016    source источник
comment
Может ли это быть просто случаем перезапуска вашего пула приложений IIS по таймеру по умолчанию? Это приведет к тому, что все ваше приложение будет по существу перезапущено, и все необходимо будет повторно инициализировать, что добавит задержку в несколько секунд для любого вызова, даже локального. Обычно лучше всего изменить настройки по умолчанию для повторного использования, чтобы он выполнялся только в определенное время или набор раз, поскольку по умолчанию это примерно каждые 10-20 минут.   -  person mbrdev    schedule 10.09.2016
comment
хорошая точка зрения! Несколько лет назад я столкнулся с этой проблемой на наших веб-сервисах IIS. Но, насколько я знаю, самостоятельные веб-сервисы с cors не нуждаются ни в IIS, ни даже в IIS Express. Это всего лишь один процесс без повторного использования. Я просто искал какой-то режим ожидания или спящего режима при запуске IAppBuilder, и немного Google не нашел ничего полезного. Мой кто-то знает больше по этой теме? Я добавлю свой метод запуска в свои данные квеста.   -  person user2029101    schedule 11.09.2016
comment
Может быть откат? По умолчанию SiganlR использует автоматический транспорт, который попытается подключиться с помощью веб-сокетов, и если это не удастся, он попробует serverSentEvents и, наконец, попробует longPolling. Время ожидания для попытки следующего транспорта составляет (AFAIR) 5 секунд. Кроме того, SignalR не делает 3 HTTP-запроса при запуске соединения, поэтому, если по какой-либо причине сервер отвечает медленно, клиент не может запуститься быстро.   -  person Pawel    schedule 12.09.2016


Ответы (1)


После исправления другой проблемы долгое начальное подключение также исчезло.

Что я обнаружил: было состояние гонки, и редко блокировка с доступом к файлам через сетевой ресурс блокировала концентратор, обновляя локальные кэшированные эскизы.

Спасибо в любом случае!

person user2029101    schedule 30.09.2016