带Web套接字的SignalR

我试图让websockets在我的开发环境中工作:

  • Visual Studio 2010
  • Windows 7的
  • 信号R 0.51
  • 最新的Chrome / Firefox

不幸的是,Javscript客户端正在使用长轮询。 当我在客户端强制使用Web套接字时,我根本无法连接:

$.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?

根据这个答案https://stackoverflow.com/a/9135334/700926,您将看到SignalR中的WebSocket支持依赖于Windows 8 / IIS8 – 答案也指向SignalR的github页面上的Wiki页面,但是,该页面确实如此不再存在了。

但是,通过在github上克隆wiki repo并返回一些修订版,您将看到SignalR.WebSockets项目的文档,根据SignalR的github页面,它不再存在 – (这可能解释了为什么删除了wiki站点) – 但是,在今年2月修订SignalR.WebSockets ,它表示:

SignalR.WebSockets包可以添加到现有的SignalR项目中,以允许客户端使用WebSocket协议进行连接。 SignalR jQuery客户端将自动尝试通过WebSockets进行连接(如果浏览器支持它),因此客户端不需要对基于SignalR的应用程序添加WebSockets进行任何更改。

SignalR.WebSockets依赖于Microsoft.WebSockets ,以便从ASP.NET中侦听传入的WebSocket连接。 此包依赖于添加到ASP.NET 4.5和IIS 8.0的新WebSockets支持。 因此,SignalR.WebSockets包只能在Windows 8计算机上运行(.NET 4.5将在早期版本的Windows上安装,但IIS 8.0需要Windows 8)。 有关如何设置Windows 8计算机的更多信息(使用开发人员预览),请参阅此处 。

我试图搜索比上面提供的信息更新的信息,但据我所知,SignalR wiki并未在其当前版本中明确涵盖此主题。

即使在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下,添加以下设置:

      

SignalR自动协商websockets,不必指定它,代码中不需要任何特殊内容。

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

除了解决SignalR中WebSockets问题的上述解决方案之外,如果您在公司网络内(或类似结构的东西),您的代理和防火墙可能会干扰握手。

但是,如果您通过SSL访问它,它提供的包装器在许多情况下可以保护它免受这种干扰。