SignalR не использует транспорт Websocket с ASPNET 4.6

Мы пытаемся использовать автономный сервер SignalR, и у нас есть несколько встроенных концентраторов, которые мы используем. Они работают правильно, но мне не удалось заставить SignalR использовать транспорт WebSockets.

В общем, у меня были проблемы с поиском текущей информации о требованиях для получения SignalR для ведения переговоров с использованием WebSockets. Может кто-нибудь помочь нам выяснить, почему WebSockets не используются?

Немного о нашей конфигурации:

  • Сервер SignalR:
    • "Microsoft.AspNet.SignalR": "2.2.1"
    • Framework: net462
  • Хостинг:
    • Службы приложений Azure
      • Веб-сокеты: вкл
      • CORS: разрешенное происхождение: *
      • Уровень цен: базовый: 1 маленький
      • Версия.NET Framework v4.6
      • Сертификат SSL

Мы используем самые последние версии Chrome и Edge в качестве клиента JS.

Вот некоторые из наших конфигураций сервера SignalR:

Startup.cs

app.UseOwinAppBuilder(map =>
{
    map.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    HubConfiguration hubConfiguration = new HubConfiguration
    {
        EnableDetailedErrors = hubConfig.EnableDetailedErrors.Value,
    };
    map.MapSignalR("/signalr", hubConfiguration);
});


public static IApplicationBuilder UseOwinAppBuilder(this IApplicationBuilder app, Action<IAppBuilder> configuration)
{
    if (app == null)
    {
        throw new ArgumentNullException(nameof(app));
    }

    if (configuration == null)
    {
        throw new ArgumentNullException(nameof(configuration));
    }

    return app.UseOwin(setup => setup(next =>
    {
        AppBuilder builder = new AppBuilder();
        IApplicationLifetime lifetime = (IApplicationLifetime)app.ApplicationServices.GetService(typeof(IApplicationLifetime));
        IServiceProvider serviceProvider = (IServiceProvider)app.ApplicationServices.GetService(typeof(IServiceProvider));
        IHostingEnvironment hostingEnv = (IHostingEnvironment)app.ApplicationServices.GetService(typeof(IHostingEnvironment));

        AppProperties properties = new AppProperties(builder.Properties);
        properties.AppName = hostingEnv.ApplicationName;
        properties.OnAppDisposing = lifetime.ApplicationStopping;
        properties.DefaultApp = next;

        configuration(builder);

        return builder.Build<Func<IDictionary<string, object>, Task>>();
    }));
}

Согласовать ответ от сервера SignalR:

https: //customdomain/signalr/negotiate?clientProtocol=1.5&connectionData=[]"name":"hubname "}]

{
    "Url": "/signalr",
    "ConnectionToken": "MTY5ODlmZmItMDUxNC00ZmJhLTgzZjMtOTcyOGM5ZTUxY2IwOg==",
    "ConnectionId": "16989ffb-0514-4fba-83f3-9728c9e51cb0",
    "KeepAliveTimeout": 20,
    "DisconnectTimeout": 30,
    "ConnectionTimeout": 110,
    "TryWebSockets": false,
    "ProtocolVersion": "1.5",
    "TransportConnectTimeout": 5,
    "LongPollDelay": 0
}

JS клиент инициализация:

$.connection.hub.logging = true;
$.connection.hub.start({ 
    transport: ['webSockets', 'longPolling'],
    withCredentials: false
});

Полный Web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <httpRuntime targetFramework="4.6"/>
        <compilation targetFramework="4.6" strict="true">           
        </compilation>
    </system.web>
    <system.webServer>
        <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
        </handlers>
        <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
    </system.webServer>
</configuration>

Сообщения консоли Chrome Tools:

[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: Fired ajax abort async = false.
[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: Auto detected cross domain url.
[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: Client subscribed to hub 'concurrentaccesshub'.
[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: Negotiating with 'https: //customdomain/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22concurrentaccesshub%22%7D%5D'.
[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: longPolling transport starting.
[19:05:23 GMT-0400 (Eastern Daylight Time)] SignalR: Opening long polling request to 'https: //customdomain/signalr/connect?transport=longP…Og%3D%3D&connectionData=%5B%7B%22name%22%3A%22concurrentaccesshub%22%7D%5D'.
[19:05:23 GMT-0400 (Eastern Daylight Time)] SignalR: Long poll complete.
[19:05:23 GMT-0400 (Eastern Daylight Time)] SignalR: LongPolling connected.
[19:05:23 GMT-0400 (Eastern Daylight Time)] SignalR: longPolling transport connected. Initiating start request.

Редактировать 26.04.2017

Согласно предложению, я явно установил транспорт как транспорт webSockets:

$.connection.hub.logging = true;
$.connection.hub.start({ 
    transport: ['webSockets'],
    withCredentials: false
});

Вот сообщения об ошибках:

SignalR: Auto detected cross domain url.
SignalR: Client subscribed to hub 'concurrentaccesshub'.
SignalR: Negotiating with 'http: //localhost:56637/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22concurrentaccesshub%22%7D%5D'.
SignalR: No transports supported by the server were selected.
SignalR: Stopping connection.

1 ответ

Я не могу воспроизвести проблему на моей стороне, основываясь на вашем описании. Я могу использовать Websocket Transport с ASPNET 4.6 в Azure Web App.

"TryWebSockets": ложь,

Этот ответ означает, что webSocket отключен на стороне сервера. webSocket также может быть отключен в web.config. Пожалуйста, проверьте, содержит ли ваш файл веб-конфигурации следующий раздел.

<system.webServer>
  <webSocket enabled="false"/>
</system.webServer>

Обновлено 02.05.2017

Поскольку вы используете OWIN, проверьте, добавили ли вы следующий код в метод Startup.Configure для использования веб-носка.

public void Configure(IApplicationBuilder app)
{
    app.UseWebSockets();
    app.UseSignalR();
}
Другие вопросы по тегам