2014-10-30 148 views
4

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

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

我把这个在我们的开发服务器(Windows Server 2012中,IIS8,.NET 4.5.1),我使用的是Chrome在Windows 7

展望的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服务器,IIS8,NET 4.5.1。

这一次的应用程序连接使用Web Socket和谈判调用如下:

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是真正的这个时候。

谁能告诉我为什么在第一个例子中它不是试图使用Web套接字?它可以是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?

+0

启用详细登录signalR客户端并粘贴传输协商部分,看看为什么不选择websocket – vtortola 2014-10-31 17:13:38

+0

您是否找到解决此问题的解决方案? – Osi 2015-02-26 13:54:50

+0

SignalR.WebSockets需要Windows 8或更高版本 – 2016-09-22 15:53:33

回答

6

确保它在dev服务器上启用。

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

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

另外要在这之后重置IIS。

由于@Luke指出,你可以使用PowerShell的这一个班轮

Install-WindowsFeature -name Web-WebSockets 
+0

是的,Web服务器已在两台服务器上启用。 – Nick 2014-10-31 15:59:45

+0

这对我来说非常合适。谢谢! – tylerlindell 2017-10-18 18:55:49

+1

您可以使用Powershell并在一行中安装Web套接字:'Install-WindowsFeature -name Web-WebSockets' – Luke 2018-01-03 20:25:29

0

在Windows 7/8你会去:

  • 控制面板
  • 程序
  • 打开开启或关闭窗口功能
  • Internet Information Services
  • 万维网服务
  • 应用程序开发功能
  • WebSocket协议
  • 确保复选框被选中
  • 点击Ok 等
+0

如果在Windows 7 SignalR客户端上没有看到该选项,该怎么办? – 2017-04-06 16:20:57

1

确保您连接通过SSL将防止代理和防火墙从破坏WebSockets握手。我所描述的症状非常类似,SSL为我解决了这个问题。即使自签名的证书也可以使用,如果您不能轻松地从您的域名的网络管理员那里获得签名或加载到本地商店。

0

要解决它,你需要跟随在web.config:

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

看看答案在这个岗位

SignalR w/ Web Sockets

如果客户端不运行Windows 8或更高,你不能使用WebSocket,显然...