SignalR с веб-сокетами

Я пытаюсь заставить websockets работать в моей среде разработки:

  • Visual Studio 2010
  • Windows 7
  • Сигнал R 0,51
  • Последний Chrome / Firefox

К сожалению, клиент Javscript использует длинные опросы. Когда я использую веб-сокеты на стороне клиента, я не могу подключиться вообще:

$.connection.hub.start({ transport: ['webSockets'] })

Код сервера размещается самостоятельно и основан на образце и выглядит следующим образом:

static void Main(string[] args)
{
    string url = "http://localhost:8081/";
    var server = new Server(url);

    // Map the default hub url (/signalr)
    server.MapHubs();

    // Start the server
    server.Start();

    Console.WriteLine("Server running on {0}", url);

    // Keep going until somebody hits 'x'
    while (true)
    {
        ConsoleKeyInfo ki = Console.ReadKey(true);
        if (ki.Key == ConsoleKey.X)
        {
            break;
        }
    }
}

public class MyHub : Hub
{            
    public void Send(string message)
    {
        Clients.addMessage(message);
    }
}

Я искал вокруг и не нашел ничего определенного. Нужно ли указывать некоторые дополнительные вещи, использовать Visual Studio 2012 или это будет работать только в Windows 8 / IIS 8?

4 ответа

Решение

Основываясь на этом ответе /questions/30707429/uchebnik-po-veb-soketam-v-aspnet/30707435#30707435 вы увидите, что поддержка WebSocket в SignalR основана на Windows 8 / IIS8 - ответ также указывает на вики-страницу на странице github SignalR, однако эта страница делает больше не существует

Но, клонировав репозиторий вики на github и вернувшись к некоторым ревизиям, вы увидите документацию SignalR.WebSockets проект, который в соответствии со страницей SignalR на github больше не существует - (что может объяснить, почему сайт wiki удален), - однако, в пересмотре вики-страницы для SignalR.WebSockets с февраля этого года было заявлено, что:

Пакет SignalR.WebSockets можно добавить в существующий проект SignalR, чтобы клиенты могли подключаться по протоколу WebSocket. JQuery-клиент SignalR автоматически попытается подключиться через WebSockets (если браузер его поддерживает), поэтому на стороне клиента не требуется никаких изменений для добавления WebSockets в приложение на основе SignalR.

SignalR.WebSockets использует http://nuget.org/packages/Microsoft.WebSockets для прослушивания входящих подключений WebSocket из ASP.NET. Этот пакет, в свою очередь, зависит от новой поддержки WebSockets, которая была добавлена ​​в ASP.NET 4.5 и IIS 8.0. В результате пакет SignalR.WebSockets будет работать только на компьютере с Windows 8 (.NET 4.5 будет устанавливаться в более ранних версиях Windows, но для IIS 8.0 требуется Windows 8). Для получения дополнительной информации о том, как настроить машину Windows 8 (используя предварительный просмотр разработчика), смотрите здесь.

Я попытался найти более новую информацию, чем та, которую я смог предоставить выше, но, насколько я могу судить, вики SignalR явно не охватывает эту тему в своей текущей версии.

Даже в Windows 8 / .NET 4.5 он изначально не работал, но с этими дополнительными советами я наконец-то получил его.

  • Установить поддержку websocket

    -> Turn Windows features on or off
    -> Internet Information Services 
    -> World Wide Web Services 
    -> Application Development Features 
    -> WebSocket Protocol
    
  • в web.config, в appSettings, добавьте этот параметр:

    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    

SignalR автоматически согласовывает веб-сокеты, его не нужно указывать, и в коде ничего особенного не требуется.

Сигнал R также работает в Windows 7, IIS 7.5 и Visual Studio 2012. Единственный недостаток - использование longPolling в качестве транспортного протокола.

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

Итак, на стороне сервера (win 7, IIS 7.5) при создании соединения и прокси вы должны сделать что-то вроде этого:

Connection = new HubConnection('someUrl', false);   
Proxy = Connection.CreateHubProxy('myHubProxy');   
Connection.Start(new LongPollingTransport()).Wait(); // notice the specification of transport

Конечно, на стороне клиента таким же образом вы должны указать транспортный протокол как longPooling:

var connection = $.hubConnection('myUrl', { useDefaultPath: false });
connection.start({ transport: ['websockets', 'longPolling'], jsonp: true, xdomain: true })

В дополнение к вышеупомянутым решениям для устранения проблем с WebSockets в SignalR, если вы находитесь в корпоративной сети (или что-то похожее по структуре), вполне вероятно, что ваши прокси и брандмауэры будут мешать рукопожатию.

Но если вы обращаетесь к нему по SSL, предоставляемая им оболочка защищает его от такого вмешательства во многих случаях.

Другие вопросы по тегам