2013-04-02 229 views
2

这是我们设置的样子:SignalR .NET客户端超时

  • SignalR的服务器Windows Server 2012
  • 煎茶HTML5应用(SignalR客户端)上(ASP.NET MVC应用程序)相同的服务器(Windows Server 2012)。
  • Windows Server 2008 R2服务器上的.NET Windows服务。这也可以作为SignalR客户端。

我们正在使用几周前的SignalR开发版本(1.1.0)。偶尔,我们发现SignalR服务器失去了与.NET客户端的连接。使用最新版本允许我们添加客户端日志记录。

上周四(2013年3月28日下午6.33)我们举了一个很好的例子。

客户端日志(为了简洁起见,我删除了不重要的日志)。请注意,Hub类被称为“Transmitter”。

ChangeState(New connection, Disconnected, Connecting) 
WS: wss://www.myURL.com/SignalRServer/signalr/connect?transport=webSockets&connectionToken=fsfY8BWv5eiSNuQtHW6wfY6XWDInkrVEn5fyHogSIyapob1BxoZLz0aMO_IuARmd9suam3my3yU0sQOEYMah-ZVj_4idQHXKQmhUKyRFlNgObCWlblCDfXflOq4Fxt8P0&connectionData=[{"Name":"Transmitter"}] 
Auto: Failed to connect to using transport webSockets. System.PlatformNotSupportedException: The WebSocket protocol is not supported on this platform. 
    at System.Net.WebSockets.ClientWebSocket..ctor() 
    at Microsoft.AspNet.SignalR.Client.Transports.WebSocketTransport.<PerformConnect>d__0.MoveNext() 
SSE: GET https://www.myURL.com/SignalRServer/signalr/connect?transport=serverSentEvents&connectionToken=fsfY8BWv5eiSNuQtHW6wfY6XWDInkrVEn5fyHogSIyapob1BxoZLz0aMO_IuARmd9suam3my3yU0sQOEYMah-ZVj_4idQHXKQmhUKyRFlNgObCWlblCDfXflOq4Fxt8P0&connectionData=[{"Name":"Transmitter"}] 
ChangeState(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Connecting, Connected) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: initialized) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {"C":"B,25|1,0|2,0|3,0","M":[{"H":"Transmitter","M":"joined","A":["0e3cd780-9efc-4824-b9a2-bae81b9be17f","27/03/2013 8:16:46 PM"]}]}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {"C":"B,25|1,1|2,0|3,0","M":[{"H":"Transmitter","M":"isLoggedIn","A":[true]}]}) 
OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, {"I":"0"}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
............ 
............ 
............ 
............ 
............ 
............ 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
Connection Timed-out : Transport Lost Connection 28/03/2013 8:33:14 AM 
ChangeState(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Connected, Reconnecting) 
SSE: GET https://www.myURL.com/SignalRServer/signalr/?transport=serverSentEvents&connectionToken=fsfY8BWv5eiSNuQtHW6wfY6XWDInkrVEn5fyHogSIyapob1BxoZLz0aMO_IuARmd9suam3my3yU0sQOEYMah-ZVj_4idQHXKQmhUKyRFlNgObCWlblCDfXflOq4Fxt8P0&messageId=B%2C6&connectionData=[{"Name":"Transmitter"}] 
ChangeState(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Reconnecting, Connected) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: initialized) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {"C":"B,7","M":[{"H":"Transmitter","M":"rejoined","A":["0e3cd780-9efc-4824-b9a2-bae81b9be17f","28/03/2013 6:33:12 PM"]}]}) 
OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, {"I":"12"}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
............ 
............ 

连接超时之前,一切都按预期工作 - SignalR服务器可以调用.NET客户端的方法,反之亦然。 连接超时后,.NET客户端可以调用服务器Hub方法,但服务器无法调用.NET客户端方法。

其他注意事项:

  • 注意,连接超时报告“28/03/2013上午08点33分14秒”的时间。这与随后输入的时间不同,时间实际上是6:33:14 PM(澳大利亚EST)。
  • 从上面可以看出ServerSentEvents正在使用,因为SignalR .NET客户端位于Windows 2008服务器上。
  • 超时没有模式。有时几天内不会发生,有时几小时内会发生。
  • 超时不涉及被重新启动机器(两者,其中SignalR服务器或在SignalR客户端驻留),IIS重置等

此外,这是瞬间的连接损耗大不一样并重新连接,似乎按要求工作。在连接瞬间消失的一个示例如下所示:

SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
ChangeState(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Connected, Reconnecting) 
SSE: GET https://www.myURL.com/SignalRServer/signalr/?transport=serverSentEvents&connectionToken=fsfY8BWv5eiSNuQtHW6wfY6XWDInkrVEn5fyHogSIyapob1BxoZLz0aMO_IuARmd9suam3my3yU0sQOEYMah-ZVj_4idQHXKQmhUKyRFlNgObCWlblCDfXflOq4Fxt8P0&messageId=B%2C1D%7CF%2CE%7CG%2C0%7CH%2C0&connectionData=[{"Name":"Transmitter"}] 
ChangeState(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Reconnecting, Connected) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {"C":"B,2","M":[{"H":"Transmitter","M":"rejoined","A":["00fabf13-eb07-4704-8d43-4d8865a519f0","28/03/2013 4:08:26 PM"]}]}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: initialized) 
OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, {"I":"11"}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 
SSE: OnMessage(0e3cd780-9efc-4824-b9a2-bae81b9be17f, Data: {}) 

我不明白的是,为什么快速连接损耗和重新连接似乎工作,但连接超时后重新连接不工作。

我们能做些什么来解决这个问题吗?

在此先感谢。

回答

1

当客户端的Disconnected事件发生时,意味着连接已被服务器删除。发生这种情况后,开发人员需要重新启动连接。

我们这样做是因为长时间在服务器上保持状态很昂贵。