Развертывание signalR с ARR в IIS (маршрутизация запросов приложений) - PullRequest
0 голосов
/ 08 января 2019

Мы используем SignalR в приложении. Был тип исключения:

Хаб-серверу не удалось запуститься. Сообщение: произошла одна или несколько ошибок. Трассировка стека: в System.Threading.Tasks.Task.ThrowIfExceptional (Boolean includeTaskCanceledExceptions) в System.Threading.Tasks.Task.Wait (Int32 millisecondsTimeout, Отмена взята Отмена взята) в System.Threading.Tasks.Task.Wait () в ProjectName.TryStartHub (Источник объекта, ElapsedEventArgs e)

Хотя не было ошибки, когда мы тестировали локально в моей системе. Когда мы развернули его с ARR. тогда было исключение, которое было только из-за ARR. В то время как мы также удалили ARR, а затем попробовали это сработало. Но это не работает с ARR.

Код правильный, но есть проблема конфигурации SignalR с ARR.

    public void InitializeHub()
    {
        appLog.Write("Initializing Hub Server");
        IHubProxy _hub;
        var querystringData = new Dictionary<string, string>();
        querystringData.Add("Key", "key1");
        hypervisorConnection = new HubConnection("url", querystringData);
        _hub = hConnection.CreateHubProxy("Hub");
        _hub.On<HypervisorCommand>("ExecuteHypervisorCommand", x => ExecuteHypervisorCommand(x));

        #region Initialize Hub Timer
        hHubTimer = new System.Timers.Timer();
        hHubTimer.Elapsed += new ElapsedEventHandler(TryStartHub);
        hHubTimer.AutoReset = false;
        hHubTimer.Interval = 1000;
        hHubTimer.Enabled = true;
        hHubTimer.Start();
        #endregion
    }

    private void TryStartHub(object source, ElapsedEventArgs e)
    {
        try
        {
            if (hConnection.State != ConnectionState.Connected)
            {
                hConnection.Start().Wait();
                appLog.Write("Hypervisor Hub server started.");
            }
        }
        catch (Exception ex)
        {
            appLog.Write("Hub Server was unable to start. Message:" + ex.Message + "\n Stack trace:" + ex.StackTrace);
        }
        hHubTimer.Interval = 30000;
        hHubTimer.Start();
    }

1 Ответ

0 голосов
/ 09 января 2019

Итак, наконец-то мы решили эту проблему. Проблема была в конфигурации ARR балансировщика нагрузки IIS (Application Request Routing).

1. Сначала выберите ARR из меню IIS. enter image description here 2. Перейдите в прокси и установите порог буфера ответов равным 0. Почему мы должны установить размер буфера ответов равным 0? Вот подробное описание: По умолчанию это значение равно 256 КБ, что означает, что он будет буферизовать ответы, пока они не достигнут этого объема. Если установить значение 0, ARR больше не будет буферизоваться, а SignlR будет работать правильно.

enter image description here

3. Затем перейдите к балансировщику нагрузки и измените алгоритм балансировки нагрузки с «циклического перебора» на «Переменная хэша сервера». Теперь клиент SignalR каждый раз будет подключаться к хабу.

...