【问题标题】:does self hosted signalr require windows server 2012 in order to use websockets?自托管信号器是否需要 windows server 2012 才能使用 websockets?
【发布时间】:2013-07-30 21:41:40
【问题描述】:

自托管应用程序似乎不通过 IIS 运行,所以它是否需要特定的操作系统才能在服务器端启用 Web 套接字?

【问题讨论】:

    标签: signalr


    【解决方案1】:

    浏览器会支持它,因为它们已经在内部实现了协议,大多数浏览器不会使用操作系统传输库,因此即使操作系统不直接支持它,它们也可以使用 WebSockets。

    Windows 8/2012 has no built in support for WebSockets 之前的 HTTP.SYS,因此尽管 .NET 4.5 包含 WebSocket 类,但除非您在 Windows 8/2012 上运行 .NET 4.5+,否则它们将无法工作,这将影响自托管在 Windows

    实现驻留在 .NET 和 IIS8 刚刚利用的操作系统代码中。 .NET 类只是将调用封装到 HTTP.SYS,因此它会在没有底层支持的操作系统上引发异常。

    但是,当自托管时,您可以使用自己的内部 Web 套接字服务器,例如 Fleck,并告诉 SignalR,无论您的操作系统如何,您实际上都支持 Web 套接字。

    在您的自托管应用程序中启动Fleck 服务器(their site 上的示例),作为示例,您可以为 PersistentConnection 自托管:

    public override Task ProcessRequest(HostContext context)
    {
      // Override what SignalR will be telling you internally and point to your own Web Socket Server.
      context.Items[HostConstants.SupportsWebSockets] = true;
      context.Items[HostConstants.WebSocketServerUrl] = "ws://localhost:3000";
      return base.ProcessRequest(context);
    }
    

    免责声明:这是一个未记录的功能,SignalR 的开发人员告诉我,这在库的未来版本中可能无法实现。请记住,您还需要满足保持活动状态并将您的数据序列化为 JSON,以便它与 SignalR 客户端配合得很好。它在 1.1.3 版本中仍然有效。

    【讨论】:

    • 那么解决方案很简单。只需将 HTTP.sys 反向移植到早期版本! #$%@%#@$ 有多难?我们有开发硬件,我们很想迁移到 Win8,但由于没有 Win8 驱动程序支持,我们无法迁移到 Win7。
    • 我想了解更多这方面的信息。我一直在尝试做类似的事情,直到现在才知道这是一个选择。我有一个在端口上监听的自定义 websocket 服务器,我添加了上面的代码,引用了端口,但是我该如何让 owin 部分使用它呢?例如,WebApp.Start('localhost:12345') 为信号 r 启动一个 http 侦听器。
    • @sqenixs 你在设置 SignalR 时没有做任何不同的事情,你只需要在继承自 PersistentConnection 或 HubConnection 的类中重写 ProcessRequest。 Owin 与这个问题或答案无关,完全偏离主题。
    • @BrutalDev 我不会说这是题外话,因为根据 Microsoft 文档,Signal R 是基于 OWIN 构建的。当您启动一个自托管的 Signal R Web 应用程序(通过 OWIN)时,您如何启动 websocket 侦听器而不是 http 侦听器?在我对您的回答进行的测试中,服务器端的 Signal R 中未启用/使用 websocket。
    • @sqenixs 跑题了,这是关于在操作系统上运行时启用 WebSockets 否则会禁用它,OWIN 没有功能,因为它只是一个解耦接口标准......你仍然需要一个HTTP 侦听器就像正常协商传输一样,在这方面没有任何变化,当您的服务器报告它支持 WebSockets(感谢覆盖)时,它将尝试连接到您定义的端点。这仅适用于 SignalR 1,如果您使用的是 SignalR 2,MS 已故意禁用上述解决方案,上述代码将被完全忽略。
    【解决方案2】:

    通过快速测试,我确定现在不支持 websocket。我创建了一个自托管集线器,然后创建了一个快速 jquery 客户端。在我的 Windows 8 机器上,查询字符串显示 websockets,在服务器 2008 r2 上显示长轮询......

    【讨论】:

      【解决方案3】:

      是的,它需要 Windows Server 2012 检查下面来自SignalR Supported Platforms 的报价

      SignalR 服务器组件可以托管在以下服务器或 客户端操作系统。请注意,对于 SignalR 使用 WebSockets, 需要 Windows Server 2012 或 Windows 8(WebSocket 可以在 Windows Azure 网站上使用,只要站点的 .NET 框架版本设置为 4.5,并且在站点的配置页面中启用了 Web Sockets)。

      还有一个很好的阅读为什么可以找到here

      【讨论】:

      • 对,但这只是因为它是通过 asp.net 使用 IIS。自托管信号器不一定需要 IIS 8。此外,如果您查看源代码,只要安装了 .net 4.5,它看起来就像 WebSockets 已融入 OWIN。不过,我不具备阅读和了解的超级技能,这就是我要问的原因。
      • @ton.yeung 实际上不是,这是操作系统级别的功能,因为即使是客户端应用程序也需要 Windows 8 才能运行,除非您使用浏览器作为客户端,否则您将需要一个带有 HTML 的浏览器5 支持
      • 如果支持 HTML5 的浏览器允许 websockets,它怎么能成为操作系统级别的功能?
      • @ton.yeung 我不能说我 100% 确定,但我认为这是因为 HTML 5 支持它,并且任何支持 HTML 5 的浏览器都需要包含它而忽略操作系统,所以浏览器不依赖于操作系统,而 .NET 框架则依赖于操作系统
      • @ton.yeung:如果浏览器内部实现了协议,浏览器将支持它,大多数浏览器不会使用操作系统传输库,因此即使操作系统也可以使用 WebSockets不直接支持。 Windows 8/2012 之前的 HTTP.SYS 没有对 WebSockets 的内置支持,因此尽管 .NET 4.5 包含 WebSocket 类,但除非您在 Windows 8/2012 上运行,否则它们将无法工作,这会影响自托管。该实现驻留在 .NET 和 IIS8 刚刚利用的操作系统代码中。
      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多