31

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

  • 视觉工作室 2010
  • Windows 7的
  • 信号 R 0.51
  • 最新的 Chrome / Firefox

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

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

4 回答 4

58

即使在 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,它不必指定,代码中也不需要什么特别的。

于 2012-08-01T13:09:26.133 回答
23

基于此答案https://stackoverflow.com/a/9135334/700926您将看到 SignalR 中的 WebSocket 支持依赖于 Windows 8 / IIS8 - 答案还指向 SignalR 的 github 页面上的 wiki 页面,但是,该页面确实不存在了。

但是,通过克隆 github 上的 wiki 存储库并返回一些修订,您将看到SignalR.WebSockets根据 SignalR 的 github 页面不再存在的项目文档 - (这可能解释了为什么删除 wiki 站点) - 但是,在从今年 2 月起对维基页面进行了修订SignalR.WebSockets,其中指出:

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

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 在其当前版本中并未明确涵盖该主题。

于 2012-07-22T16:57:18.787 回答
0

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 })
于 2014-02-05T12:36:49.860 回答
0

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

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

于 2015-07-02T16:32:41.273 回答