SignalR Core не использует веб-узлы в службе приложений Azure

Я работаю над веб-приложением SignalR Core, которое использует следующий стек:

  • ASP.NET Core 2.1 превью 2 (2.1.0-preview2-final)
  • SignalR Core 1.0 превью 2 (1.0.0-preview2-final)
  • Microsoft.AspNetCore.Cors (2.1.0-preview2-final)
  • Microsoft.AspNetCore.WebSockets (2.1.0-preview2-final)

Клиент использует пакет SignalR NPM (@ aspnet / signalr).

Приложение настроено так:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy(
            "CorsPolicy",
            builder => builder
                .AllowCredentials()
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
    });

    services.AddSignalR();
}

public void Configure(IApplicationBuilder app)
{
    app.UseCors("CorsPolicy");
    app.UseDefaultFiles();
    app.UseStaticFiles();
    app.UseWebSockets();
    app.UseSignalR(routes =>
    {
        routes.MapHub<ClientHub>("/hubs/notifications");
    });
}

При локальной работе в http://localhost клиент подключается по протоколу WS. Но при развертывании в службе приложений Azure он возвращается к SSE.

Журнал браузера показывает:

WebSocket connection to 'wss://xxxxxx.azurewebsites.net/hubs/notifications?id=ZRniWKpMLMPIyLhS5RSyAg' failed: Error during WebSocket handshake: Unexpected response code: 503
Information: SSE connected to https://xxxxxx.azurewebsites.net/hubs/notifications?id=ig47oOdQzbasdgrlr0cHaw

Метод negotiate, похоже, возвращает поддержку Websockets:

{"connectionId":"ZRniWKpMLMPIyLhS5RSyAg",
 "availableTransports":[
  {"transport":"WebSockets","transferFormats":["Text","Binary"]},
  {"transport":"ServerSentEvents","transferFormats":["Text"]},
  {"transport":"LongPolling","transferFormats":["Text","Binary"]}]
}

Я что-то упускаю? Или WSS еще не поддерживается?


person Matias Quaranta    schedule 13.04.2018    source источник
comment
Включили ли вы WS в экземпляре службы приложений Azure?   -  person Camilo Terevinto    schedule 13.04.2018
comment
/ facepalm Я не заметил, что для этого есть настройка   -  person Matias Quaranta    schedule 13.04.2018


Ответы (1)


Чтобы ответить на мой собственный вопрос, сбой в соединении с веб-сокетом не был проблемой с ASP.NET Core или стеком, а из-за того, что в службе приложений Azure должны быть включены веб-сокеты в параметрах приложения. :

Переключатель WebSocket в настройках приложения

person Matias Quaranta    schedule 13.04.2018
comment
Я не вижу эту настройку в своем веб-приложении, я вижу только «Всегда включен», какие еще настройки можно включить, чтобы это получить? - person leeroya; 25.08.2019
comment
Они все еще там, очевидно, прошло больше года с тех пор, как этот ответ и пользовательский интерфейс обязательно изменятся. Настройки ›Конфигурация, а затем на вкладке Общие настройки. Это может быть ограничение вашего ценового уровня службы приложений? - person Matias Quaranta; 26.08.2019
comment
Привет, спасибо за повтор и хочу обновить это. Я провел небольшое исследование и выяснил, что эта функция в настоящее время недоступна для хоста Linux, но вы можете включить ARR Affinity с постоянным включением, чтобы добиться аналогичного поведения. Я согласен с тем, что оригинал старый, и я хотел попытаться выяснить, не упустил ли я что-то. - person leeroya; 10.09.2019