SignalR不使用Web套接字

Nic*_*ick 7 .net iis asp.net-mvc websocket signalr

我在使用SignalR实际使用网络套接字时遇到问题.它是使用ASP.NET MVC构建的Intranet应用程序.

为了测试,我使用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"
Run Code Online (Sandbox Code Playgroud)

然后我将同一个应用程序复制到生产服务器,再次是Windows 2012 Server,IIS8,.NET 4.5.1.

这次应用程序使用Web套接字进行连接,协商调用如下所示:

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"
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以告诉我为什么在第一个例子中它不试图使用Web套接字?可能是IIS配置?我确保两个实例在其应用池中具有相同的设置.

可能是防火墙问题?这两台服务器位于网络的不同部分,但我不确定它们之间的区别.也许这是路由器问题?

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

欢迎任何想法/解决问题的步骤.

编辑:

好的,我在ASP.NET网站上的本文后面的服务器和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)
Run Code Online (Sandbox Code Playgroud)

在客户端上,以下内容出现在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
Run Code Online (Sandbox Code Playgroud)

有没有告诉我为什么SignalR没有使用Websockets?

dov*_*ove 13

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

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

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

此后还要重置IIS.

正如@Luke所指出的,你可以使用powershell的这一个衬里

Install-WindowsFeature -name Web-WebSockets
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用 Powershell 并在一行中安装 Web 套接字:`Install-WindowsFeature -name Web-WebSockets` (2认同)