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