【问题标题】:Signalr always falls to long polling in the production serverSignalr 总是陷入生产服务器中的长轮询
【发布时间】:2014-11-15 12:14:39
【问题描述】:

当我在服务器中托管应用程序时,它会检查服务器端事件并始终回退到长轮询。服务器托管环境为 Windows Server 2012 R1 和 IIS 7.5

有没有办法解决这个问题?

https://cloud.githubusercontent.com/assets/9750273/5050991/2f4cb262-6c59-11e4-9e35-db06b432d470.png

IE10、Chrome 38.0.2125.111 和 Firefox.. 在所有 3 个浏览器中,我都在进行长轮询,服务器发送的事件被取消。据我了解,他们中很少有人告诉服务器是否位于代理和防火墙后面,那么服务器发送的事件可能无法正常工作。由于该站点位于生产服务器中,因此我无法对其进行任何控制。

导致此问题的可能性有哪些?如何调试?

【问题讨论】:

  • 您可能只是忘记安装 WebSocket 支持而将 IIS 保留为默认设置!
  • Win Server 2012 R1 不支持其 IIS 7.5 和 websocket

标签: c# asp.net signalr signalr-hub server-sent-events


【解决方案1】:

如果你想在 IIS 中支持 WebSocket,你应该启用它

这是您需要启用的角色/功能的屏幕截图:

希望对你有帮助! :)

【讨论】:

  • 不支持 IIS 7.5 和 websocket
  • 那你需要升级
  • @Brunis 他没有具体说明他需要 WebSockets,但他确实提到他希望服务器发送事件能够工作。所以他可能不需要升级。
  • 是的,我的问题是为什么服务器发送的事件被取消了。我无法升级服务器,因为它不在我的控制范围内。
  • 根据这个 SO 问题,这是因为服务器位于代理后面:stackoverflow.com/questions/12177737/… 您在问题中提到了一些关于它的内容,但我无法破译是什么。你确定它是否被代理?
【解决方案2】:

Microsoft 有一个blog post,关于让 SignalR 在带有 IIS 7.5 的 Server 2008 R2 中工作。方向可能相似。

  1. Update the SignalR application's web.config file 启用“为所有请求运行所有托管模块”(简而言之,这是 RAMMFAR 设置)。

    1. Update the web page that uses SignalR与服务器通信:

      • 添加对 json2.js 库的引用。
      • 添加一个标签,强制内容以最近的浏览器模式显示。
    2. Set up a Windows Server 2008r2 与 IIS 7.5 如下:

      • 安装 SignalR 应用程序所需的 .NET Framework 版本。
      • 创建一个站点并将其与适当的应用程序池相关联。

这是 RAMMFAR 设置的方法。

<system.webServer>
   <modules runAllManagedModulesForAllRequests="true">
   </modules>
</system.webServer>

我认为没有必要添加 json2.js 库引用。但这是您应该在网页头部放置的元标记:

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

对于 IIS 中的应用程序池,使用集成模式,而不是经典模式。当然,使用 .NET 4.0。

【讨论】:

  • 所有这些设置都被忽略了。仍然通过长轮询进行通信。有没有办法了解它为什么使用长轮询的实际原因?
【解决方案3】:

SignalR 基于 Web RTC。 Web RTC 在浏览器和服务器之间创建一个持久的 TCP 连接。 HTTP 连接不是持久的。每次您的浏览器调用服务器时,它都会为此请求创建一个新的 TCP 连接并获得响应。 持久连接对于代理服务器来说是有问题的。将signalR与负载平衡一起使用也很困难。您有多个 Web 服务器和一个负载均衡器(可能是代理)选择将您的请求传输到您场中的一个 Web 服务器,因此客户端只能连接到您的负载均衡器。

但是: 首先检查您的生产 Web 服务器上是否启用了 Web RTC!

【讨论】:

  • SignalR 不是基于 WebRTC。 WebRTC 是一种用于视频通话、语音聊天和文件共享的协议。 SignalR 可以使用多个传输层中的任何一个,具体取决于客户端和服务器软件的版本和配置。其中“最理想的”是WebSocket,与您的答案不同,它每次发送数据时都不需要建立新连接。
  • 服务器不支持 Webscockets。已在 IIS 7.5 和 windows server 2012 R1 中配置
猜你喜欢
  • 2013-07-16
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2012-06-10
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多