我们遇到了一个有趣的问题。以下是我们的设置:
最初我们使用SignalR 0.5.3 - 当我们开始观察到Windows服务与信号R服务器的连接中断时。频率范围从每几分钟到每几个小时。它在大多数情况下重新连接,但偶尔无法重新连接,导致Windows服务每两天丢失一次连接。但它没有固定的模式。它与服务器重启/备份等无关。我们在Windows服务中添加了日志记录以监视客户端连接上的StateChanged事件,并发现事件在断开连接并重新连接时被触发,但在没有重新连接时则触发。 / p>
然后我们遇到了这个帖子:client constantly reconnecting
并决定将所有内容升级到SignalR 1.0.1(我们不得不在某些时候这样做)。 Windows服务也升级到框架4.5(来自Framework 2.0),现在引用新的Microsoft.AspNet.SignalR.Client.dll。这也允许我们(使用新添加的连接属性)确定Windows服务实际上使用ServerSentEvents协议。在Windows Server 2012计算机上安装相同的Windows服务使用WebSockets协议。这符合这个主题:SignalR .NET Client doesn't support WebSockets on Windows 7
但是,Windows Server 2008 R2服务器上的服务行为没有更改。它仍然断开连接并重新连接,偶尔会失去连接。由于一些限制,我们无法使用Windows Server 2012进行Windows服务,并且无法使用较旧的操作系统。这并不是说使用websockets协议的Windows服务可以解决我们所有的问题(我们没有彻底测试过)。
我们尝试的第三件事是从GitHub获取源代码并编译它并升级服务(SignalR Server和客户端) - 这样做是为了确保我们获得最新的副本以及任何潜在的错误修复。 / p>
但它没有帮助。我们现在处于一种我们认为已经筋疲力尽的选择。建议将不胜感激。感谢。
=====================================
编辑:更多信息:
好的,现在我们有更多信息。我们在Windows服务(SignalR Client)中添加了一些代码,每30分钟登录一次SignalR服务器(用于测试连接)。
以下是每30分钟在客户端发生的事情:
WriteEvent(Now(), "INFO", "PING", "Performing logon procedure with SiteCode = " & msSiteCode & ".")
trans.Invoke("login", New String() {msSiteCode, "", "SERVER", "", ""})
其中trans是从Hub继承的服务器端类的实例,而WriteEvent基本上是写入日志文件的跟踪。
并且客户端也有一个'isLoggedIn'方法,如下所示:
Private Sub isLoggedIn(ByVal bLoggedIn As String)
If bLoggedIn Then
WriteEvent(Now(), "INFO", "", "SignalR Server: Authenticated")
Else
WriteEvent(Now(), "ERROR", "", "SignalR Server: Authentication failed")
End If
End Sub
在服务器端,我们有登录方法:
Public Sub login(ByVal sAccount As String, _
ByVal sCompanyCode As String, _
ByVal sClientId As String, _
ByVal sPassword As String, _
ByVal sModuleCode As String)
Try
'Some code omitted that validates the user and sets bValidated.
If bValidated Then
'Update user in cache
ConnectionCache.Instance.UpdateCache(userId, Context.ConnectionId, UserCredential.Connection_Status.Connected)
Clients.Caller.isLoggedIn(True)
Dim connectionId As String = ConnectionCache.Instance.FindConnectionId(userId)
LogEvent("Successful login for connectionid: " & connectionId & ". Context. User: " & userId, _
EventLogEntryType.Information)
Else
Clients.Caller.isLoggedIn(False, results)
End If
Catch ex As Exception
LogEvent("Login: " & ex.Message, EventLogEntryType.Error)
End Try
End Sub
如果我们查看客户端日志文件,则每30分钟我们会收到以下日志条目:
因此我们知道正在调用登录服务器端方法,并且还调用了isLoggedIn客户端方法。
但是,在某些时候,在调用服务器端方法时,不会调用isLoggedIn客户端方法。所以每30分钟,我们就开始只有一个条目:
另外,日志事件:
LogEvent("Successful login for connectionid: " & connectionId & ". Context. User: " & userId, EventLogEntryType.Information)
服务器端登录方法中的写在服务器端日志中。所以 Clients.Caller.isLoggedIn(True)会按预期调用,但我们在客户端看不到。
所以我猜我们正在看的是客户端始终能够访问服务器并且能够调用服务器端(登录)功能,但是服务器无法调用客户端(isLoggedIn)函数,而这在某个时刻开始发生。
此外,这可能是.NET客户特有的,因为我很确定我们的HTML5 / javascript客户端没有看到这种情况。
答案 0 :(得分:3)
最后,我们创建了一个简单的“PINGING”功能。每15分钟调用一次。 逻辑如下:
因此,当我们放弃尝试弄清楚原因是什么时,我们有一个解决方法来管理“服务器到客户端”连接的丢失。请注意,这是signalR中内置重新连接逻辑的补充。
我们还维护日志,平均而言这种情况发生(客户端不会从服务器返回PING)可能每天一次。