Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SignalR with Web Sockets

I am attempting to get websockets working in my dev environment:

  • Visual Studio 2010
  • Windows 7
  • Signal R 0.51
  • Latest Chrome / Firefox

Unfortunately the Javscript client is using long polling. When I force web-sockets on the client side I can't connect at all:

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

Server code is self-hosted and based on the sample and looks like:

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

I've searched around and found nothing definitive. Do I need to specify some extra things, use Visual Studio 2012 or will this only work on Windows 8 / IIS 8?

like image 432
Luke Belbina Avatar asked Jul 22 '12 15:07

Luke Belbina


People also ask

Is SignalR better than WebSocket?

WebSockets is actually the underlying transport that SignalR uses, at least most of the time. SignalR has the ability to fall back to other ways of transporting messages, such as long-polling over HTTP. This is useful in situations where you don't have WebSockets support.

Can SignalR be used in Web API?

Objective: Use SignalR for notification between Web API, and TypeScript/JavaScript based Web App, where Web API and the Web App is hosted in different domain. Enabling SignalR and CORS on Web API: Create a standard Web API project, and install the following NuGet packages: Microsoft.

Does SignalR use WebSockets?

SignalR. ASP.NET Core SignalR is a library that simplifies adding real-time web functionality to apps. It uses WebSockets whenever possible.


2 Answers

Even on Windows 8 / .NET 4.5 it was not working initially, but with these additional tips I finally got it working.

  • Install websocket support

    -> Turn Windows features on or off -> Internet Information Services  -> World Wide Web Services  -> Application Development Features  -> WebSocket Protocol 
  • in web.config, under appSettings, add this setting:

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

SignalR automatically negotiates websockets, it does not have to be specified and nothing special is needed in code.

like image 188
Maarten Avatar answered Sep 30 '22 20:09

Maarten


Based on this answer https://stackoverflow.com/a/9135334/700926 you will see that WebSocket support in SignalR relies on Windows 8 / IIS8 - the answer also points to a wiki page at SignalR's github page, however, that page does not exists anymore.

But, by cloning the wiki repo at github and go back some revisions you will see the documentation of the SignalR.WebSockets project which according to SignalR's github page, does not exist anymore - (which might explain why the wiki site is removed) - however, in a revision of the wikipage for SignalR.WebSockets from February this year, it stated that:

The SignalR.WebSockets package can be added to an existing SignalR project to allow clients to connect using the WebSocket protocol. The SignalR jQuery client will automatically attempt to connect via WebSockets (if the browser supports it) so no changes are necessary on the client side to add WebSockets to your SignalR based application.

SignalR.WebSockets relies on Microsoft.WebSockets in order to listen for incoming WebSocket connections from within ASP.NET. This package in turn depends on the new WebSockets support that was added to ASP.NET 4.5 and IIS 8.0. As a result, the SignalR.WebSockets package will only work on a Windows 8 machine (.NET 4.5 will install on earlier versions of Windows but Windows 8 is required for IIS 8.0). For more information on how to setup a Windows 8 machine (using the developer preview) see here.

I have tried searching for newer information than what I have been able to provide above, but as far as I can tell, the SignalR wiki does not cover this topic explicitly in its current version.

like image 44
Lasse Christiansen Avatar answered Sep 30 '22 19:09

Lasse Christiansen