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?
Ответы
Ответ 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, обертка, которую он предоставляет, защищает его от этой помехи во многих случаях.