【问题标题】:SignalR Not Using Web SocketsSignalR 不使用 Web 套接字
【发布时间】:2014-12-26 12:41:21
【问题描述】:

我在使用 SignalR 获取站点以实际使用 Web 套接字时遇到问题。这是一个使用 ASP.NET MVC 构建的内网应用程序。

为了测试,我使用 SignalR v2.1.2 将 simple chat application from the ASP.NET site 放在一起。

我把它放在我们的一台开发服务器(Windows Server 2012、IIS8、.NET 4.5.1)上,我在 Windows 7 上使用 Chrome。

查看与 ServerSentEvents 连接的 Chrome 开发工具的网络选项卡。协商调用如下所示

ConnectionId: "eee14afe-6598-492e-81ae-f14b98041474"
ConnectionTimeout: 110
ConnectionToken: "1iDREVWa++NL0Cj95i++QOufi+1+ywZlY1Tsrv7t06zqca5wn6nvPRLJQOd8/I7EPEaDGabP1MfqhoR/Q2D1vFK6bdujXdFoxGYF XlZ00AHLw9qjDuDgyx3+6a7qXHGFKp6ag6zu4TGuuW9sqM/nkw=="
DisconnectTimeout: 30
KeepAliveTimeout: 20
LongPollDelay: 0
ProtocolVersion: "1.4"
TransportConnectTimeout: 5
TryWebSockets: false
Url: "/Chat/signalr"

然后我将相同的应用程序复制到生产服务器,同样是 Windows 2012 Server、IIS8、.NET 4.5.1。

这次应用程序使用 Web Sockets 连接,协商调用如下所示:

ConnectionId: "27484ca2-2935-43fd-a6eb-ae13f7fdbd54"
ConnectionTimeout: 110
ConnectionToken: "AhL+5jrvoHa0FXdU+Zg3dJ4a3Avfw28aOZN7raTHpYxUte4GA5Ru9ZmdDZMtCZOFbnpGzOmktY56jH2Tbz+I7g3OO5RnMlBBn8CSg5Il8fb0p/faK1ShGbWhFOKBe9Ns"
DisconnectTimeout: 30
KeepAliveTimeout: 20
LongPollDelay: 0
ProtocolVersion: "1.4"
TransportConnectTimeout: 5
TryWebSockets: true
Url: "/Chat/signalr"

由于未知原因,这次 TryWebSockets 为 True。

谁能告诉我为什么它不尝试使用 Web Sockets?难道是IIS配置?我确保两个实例在其应用程序池中具有相同的设置。

可能是防火墙问题吗?两台服务器位于网络的不同部分,但我不确定有什么区别。可能是路由器问题?

这些应用在 Chrome v38 和 IE 11 中进行了测试。

欢迎提出任何想法/故障排除步骤。

编辑:

好的,我在服务器上和this article on the ASP.NET site之后的javascript中启用了跟踪

服务器生成一个传输日志文件,内容如下:

SignalR.Transports.TransportHeartBeat Information: 0 : Connection 6b0193e6-bde6-4130-b4da-178fd24a786a is New.
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(6b0193e6-bde6-4130-b4da-178fd24a786a)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(6b0193e6-bde6-4130-b4da-178fd24a786a)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(6b0193e6-bde6-4130-b4da-178fd24a786a)
SignalR.Transports.ServerSentEventsTransport Information: 0 : Abort(6b0193e6-bde6-4130-b4da-178fd24a786a)
SignalR.Transports.TransportHeartBeat Information: 0 : Removing connection 6b0193e6-bde6-4130-b4da-178fd24a786a
SignalR.Transports.ServerSentEventsTransport Information: 0 : End(6b0193e6-bde6-4130-b4da-178fd24a786a)
SignalR.Transports.ServerSentEventsTransport Verbose: 0 : DrainWrites(6b0193e6-bde6-4130-b4da-178fd24a786a)
SignalR.Transports.ServerSentEventsTransport Information: 0 : CompleteRequest (6b0193e6-bde6-4130-b4da-178fd24a786a)

在客户端的javascript控制台中出现以下内容:

SignalR: Client subscribed to hub 'chathub'. jquery.signalR-2.1.2.min.js:8
SignalR: Negotiating with '/Chat/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D'. jquery.signalR-2.1.2.min.js:8
SignalR: Attempting to connect to SSE endpoint 'https://att15web95/Chat/signalr/connect?transport=serverSentEvents&clientPr…mPZV2icA%3D%3D&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&tid=7'. jquery.signalR-2.1.2.min.js:8
SignalR: EventSource connected. jquery.signalR-2.1.2.min.js:8
SignalR: serverSentEvents transport selected. Initiating start request. jquery.signalR-2.1.2.min.js:8
SignalR: The start request succeeded. Transitioning to the connected state. jquery.signalR-2.1.2.min.js:8
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000. jquery.signalR-2.1.2.min.js:8
SignalR: Invoking chathub.Send jquery.signalR-2.1.2.min.js:8
SignalR: Triggering client hub event 'addNewMessageToPage' on hub 'ChatHub'. jquery.signalR-2.1.2.min.js:8
SignalR: Invoked chathub.Send jquery.signalR-2.1.2.min.js:8

有什么可以告诉我为什么 SignalR 不使用 Websockets 吗?

【问题讨论】:

  • 在signalR客户端启用详细日志并粘贴传输协商部分,看看为什么没有选择websocket
  • 你找到解决这个问题的方法了吗?
  • SignalR.WebSockets 需要 Windows 8 或更高版本

标签: .net asp.net-mvc iis websocket signalr


【解决方案1】:

确保在开发服务器上启用它。

  • 在任务栏上,单击服务器管理器。
  • 在服务器管理器中,单击“管理”菜单,然后单击“添加角色和功能”。
  • 在“添加角色和功能”向导中,单击“下一步”。选择安装类型,点击下一步。
  • 选择目标服务器并单击下一步。
  • 在 Server Roles 页面上,展开 Web Server (IIS),展开 Web Server,展开 Application
  • 开发,然后选择WebSocket协议。点击下一步。
  • 在“选择功能”页面上,单击“下一步”。
  • 在“确认安装选择”页面上,单击“安装”。
  • 在结果页面上,单击关闭。

取自:http://www.iis.net/configreference/system.webserver/websocket

之后还要重置 IIS。

正如@Luke 指出的那样,您可以使用这一层 powershell

Install-WindowsFeature -name Web-WebSockets

【讨论】:

  • 您可以使用 Powershell 并在一个内衬中安装 Web 套接字:Install-WindowsFeature -name Web-WebSockets
【解决方案2】:

在 Windows 7/8 上,您将转到:

  • 控制面板
  • 程序
  • 打开或关闭窗口功能
  • 互联网信息服务
  • 万维网服务
  • 应用程序开发功能
  • WebSocket 协议
  • 确保选中复选框
  • 点击确定 等

【讨论】:

  • 如果您在 Windows 7 SignalR 客户端上看不到该选项怎么办?
【解决方案3】:

确保您通过 SSL 进行连接将防止代理和防火墙中断 WebSockets 握手。我的症状与您描述的非常相似,SSL 为我修复了它。如果您无法轻松地从您的域的网络管理员那里获得签名或加载到本地存储中,那么即使是自签名证书也可以使用。

【讨论】:

    【解决方案4】:

    要修复它,您需要在 web.config 中进行以下操作:

    <system.web>
       <compilation debug="true" targetFramework="4.5"/> 
       <httpRuntime targetFramework="4.5"/>
       <pages controlRenderingCompatibilityVersion="4.0"/> 
    </system.web>
    

    【讨论】:

      【解决方案5】:

      看看这篇文章的答案

      SignalR w/ Web Sockets

      如果客户端没有运行 Windows 8 或更高版本,显然你不能使用 WebSockets...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多