带有Web套接字的SignalR

本文关键字:SignalR 套接字 Web 带有 | 更新日期: 2024-06-14 07:48:52

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

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

带有Web套接字的SignalR

即使在Windows8/.NET4.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自动协商websocket,不必指定,代码中也不需要任何特殊的东西。

基于此答案https://stackoverflow.com/a/9135334/700926你会看到SignalR中的WebSocket支持依赖于Windows8/IIS8——答案也指向SignalR的github页面上的一个wiki页面,然而,该页面已经不存在了。

但是,通过在github上克隆wiki repo并返回一些修订版,您将看到SignalR.WebSockets项目的文档,根据SignalR的github页面,该文档已不存在-(这可能解释了wiki网站被删除的原因)-然而,在今年2月对SignalR.WebSockets的wiki页面进行的修订中,它指出:

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

SignalR.WebSockets依赖Microsoft.WebSockets以便侦听来自内部的传入WebSocket连接ASP.NET。此包又依赖于新的WebSockets支持已添加到ASP.NET 4.5和IIS 8.0中。因此SignalR.WebSockets包只能在Windows 8计算机(.NET4.5将安装在早期版本的Windows上,但IIS 8.0需要Windows 8)。有关如何设置Windows的详细信息8机器(使用开发者预览)请参阅在这里

我试着搜索比我上面所能提供的信息更新的信息,但据我所知,SignalR wiki在其当前版本中没有明确涵盖这个主题。

Signal R也适用于Windows 7、IIS 7.5和Visual Studio 2012。唯一的缺点是它将使用longPolling作为传输协议。

为了在上述配置中成功地使用signalR,我们需要设置一些内容,这些内容在任何signalR教程中都没有详细说明。

因此,在服务器端(win7,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访问它,它提供的包装器在许多情况下会保护它免受这种干扰。