【问题标题】:SignalR with Web Sockets带有 Web 套接字的 SignalR
【发布时间】:2012-07-22 15:32:10
【问题描述】:

我正在尝试让 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?

【问题讨论】:

    标签: c# asp.net signalr


    【解决方案1】:

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

    【讨论】:

    • 太棒了。打算在本周末安装 Windows 8 VM,我相信这会很有帮助。
    • 完美解决方案 - 第一部分默认在 Azure Server2012 中完成。添加了 web.config 设置和网络套接字连接开始工作:-) - 谢谢 Maarten!
    • 为什么这么难找......太棒了...... :)
    • @KingOfHypocrites 这里来自微软:iis.net/learn/get-started/whats-new-in-iis-8/…
    • webconfig 更改是关键!非常感谢!
    【解决方案2】:

    基于此答案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 protocol 进行连接。 SignalR jQuery 客户端将自动尝试通过 WebSockets 连接(如果 浏览器支持它),因此客户端无需进行任何更改 将 WebSockets 添加到基于 SignalR 的应用程序中。

    SignalR.WebSockets 依赖于 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机(使用开发者预览版)见 here.

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

    【讨论】:

    • 这已经过时了,但 websocket 支持仍然依赖于 windows 8。
    • 您实际上可以在自托管应用程序中使用 WebSocket,而无需 Windows 8/2012、IIS 8 或 .NET 4.5。我在这里解释了如何做到这一点的技术:stackoverflow.com/a/18337019/564726
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-12-26
        • 2018-06-02
        • 2012-06-25
        • 2012-09-15
        • 1970-01-01
        • 2011-04-14
        • 2015-04-12
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多