SignalR不使用Web Sockets

11
我在使用SignalR时遇到了问题,无法使用web sockets。这是一个使用ASP.NET MVC构建的内部网络应用程序。
为了测试,我使用SignalR v2.1.2创建了ASP.NET网站上的简单聊天应用程序
我将其放在我们的开发服务器之一上(Windows Server 2012,IIS8,.NET 4.5.1),并在Windows 7上使用Chrome。
在Chrome开发工具的网络选项卡中查看,它正在使用ServerSentEvents进行连接。协商调用如下:
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 中进行了测试。
欢迎任何想法/故障排除步骤。
编辑:
好的,我在服务器上启用了跟踪,并在 JavaScript 中遵循了 ASP.NET 网站上的这篇文章
服务器生成一个传输日志文件,内容如下:
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。 - vtortola
你解决了这个问题吗? - Zsolt
SignalR.WebSockets 需要 Windows 8 或更高版本。 - Mr. Kraus
5个回答

23

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

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

来源:http://www.iis.net/configreference/system.webserver/websocket

此外还需要重置 IIS。

正如 @Luke 指出的,您可以使用这个 PowerShell 的一行代码来完成:

Install-WindowsFeature -name Web-WebSockets

2
您可以使用 Powershell 并在一行命令中安装 WebSockets:Install-WindowsFeature -name Web-WebSockets - Luke

1

确保您通过 SSL 连接可以防止代理和防火墙干扰 WebSockets 握手。我曾经遇到过您描述的非常相似的症状,使用 SSL 可以解决这个问题。即使是自签名证书也可以使用,如果您无法轻松获取签名证书或将其加载到您的本地存储器并由您的网络管理员为您的域签名。


1

看这篇文章的答案

使用Web Sockets的SignalR

如果客户端没有运行Windows 8或更高版本,则显然无法使用WebSockets...


0

要修复它,您需要在web.config中添加以下内容:

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

0

在Windows 7/8中,您需要前往:

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

如果在Windows 7的SignalR客户端上没有看到该选项怎么办? - Sam Storie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接