Подтвердить что ты не робот

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

Я пытаюсь получить websockets, работающие в моей среде dev:

  • 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?

4b9b3361

Ответ 1

На основе этого ответа fooobar.com/questions/146800/... вы увидите, что поддержка WebSocket в SignalR зависит от Windows 8/IIS8 - ответ также указывает на страницу вики на SignalR github однако эта страница больше не существует.

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

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

SignalR.WebSockets полагается на 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 явно не затрагивают этот вопрос в текущей версии.

Ответ 2

Даже в 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 автоматически согласовывает websockets, его не нужно указывать и ничего не нужно в коде.

Ответ 3

Signal 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 })

Ответ 4

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

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