Signalr 信令.NET客户端断开连接

Signalr 信令.NET客户端断开连接,signalr,signalr-hub,signalr.client,Signalr,Signalr Hub,Signalr.client,我们遇到了一个有趣的问题。以下是我们的设置: windows Server 2012上的信号服务器(ASP.NET MVC应用程序) 同一服务器(Windows server 2012)上的Sencha HTML5应用程序(信号客户端) Windows Server 2008 R2服务器上的.NET Windows服务。它还充当信号器客户端 最初,我们使用的是SignalR 0.5.3—当我们开始观察到windows服务与SignalR服务器的连接断开时。这种情况的发生频率从几分钟到几小时不

我们遇到了一个有趣的问题。以下是我们的设置:

  • windows Server 2012上的信号服务器(ASP.NET MVC应用程序)
  • 同一服务器(Windows server 2012)上的Sencha HTML5应用程序(信号客户端)
  • Windows Server 2008 R2服务器上的.NET Windows服务。它还充当信号器客户端
最初,我们使用的是SignalR 0.5.3—当我们开始观察到windows服务与SignalR服务器的连接断开时。这种情况的发生频率从几分钟到几小时不等。在大多数情况下,它会重新连接,但有时无法重新连接,导致windows服务每隔几天就会失去一次连接。但它没有固定的模式。它与服务器重新启动/备份等无关。我们向windows服务添加了日志记录,以监视客户端连接上的StateChanged事件,并发现该事件在断开和重新连接时触发,但在未重新连接时不会触发

然后我们遇到了这个线索:

并决定将所有内容升级到Signalr1.0.1(无论如何,我们必须在某个时候这样做)。windows服务也升级到了framework 4.5(从framework 2.0),现在引用了新的Microsoft.AspNet.signal.Client.dll。这还允许我们(使用新添加的连接属性)确定windows服务实际上使用的是ServerSentEvents协议。在windows Server 2012计算机上安装相同的windows服务时使用WebSockets协议。这与此线程一致:

但是,Windows Server 2008 R2服务器上服务的行为没有改变。它仍然会断开和重新连接,偶尔会失去连接。由于一些限制,我们无法将windows server 2012用于windows服务,只能使用较旧的OSs。这并不是说使用websockets协议的windows服务可以解决我们所有的问题(我们还没有彻底测试)

我们尝试的第三件事是从GitHub获取源代码,并对其进行编译和升级服务(SignalR服务器和客户机)——这样做是为了确保我们获得最新的副本,以及任何潜在的错误修复

但这没有帮助。我们现在正处在一个我们觉得我们已经用尽了我们的选择的时刻。如有建议,将不胜感激。谢谢

=====================================

编辑:更多信息:

好的,现在我们有更多的信息。我们在windows服务(SignalR客户端)中添加了一些代码,以便每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分钟我们会得到以下日志条目:

  • 正在使用SiteCode=ABCD执行登录过程
  • 信号服务器:已验证
因此,我们知道正在调用login服务器端方法,并且还将调用isLoggedIn客户端方法

但是,在某些情况下,当调用服务器端方法时,不会调用isLoggedIn客户端方法。因此,每30分钟,我们只会收到一个条目:

  • 正在使用SiteCode=ABCD执行登录过程
此外,日志事件:

LogEvent("Successful login for connectionid: " & connectionId & ". Context. User: " & userId, EventLogEntryType.Information)
在中,服务器端登录方法写入服务器端日志。因此,Clients.Caller.isLoggedIn(True)按预期被调用,但我们在客户端看不到这一点

所以我想我们看到的是,客户端总是能够访问服务器,并且能够调用服务器端(login)函数,但是服务器无法调用客户端(isLoggedIn)函数,并且这种情况在某个时候开始发生


另外,这可能是.NET客户端特有的,因为我很确定我们没有看到HTML5/javascript客户端出现这种情况。

最后,我们只是创建了一个简单的“ping”函数。每15分钟打一次电话。 逻辑如下:

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
  • SignalR Client有一个计时器,每15分钟调用一次服务器PING方法
  • 服务器在客户端上调用客户端的PINGCLIENT方法作为响应
  • 在客户端的下一个PING定时器事件中(15分钟后),我们检查是否得到响应。如果没有,我们将暂停所有活动并重新初始化集线器连接。然后重新启动ping定时器
  • 因此,虽然我们放弃了寻找原因的努力,但我们有一个解决办法,可以在“服务器到客户端”连接丢失时进行管理。请注意,这是信号机中内置重新连接逻辑的补充


    我们还维护日志,平均每天发生一次(客户端不会从服务器收到PING回复)。

    如果您愿意,可以在此myget提要www.myget.org/F/aspnetwebstacknightly/上为客户端试用夜间软件包。我们现在有了客户端日志记录(该连接有一个TextWriter属性Connection.Trace)。您可以使用此功能查看发生了什么,以及为什么您的网络上出现问题。谢谢。我们现在已经记录了更多的事件,并用更多信息更新了原始问题。您需要客户端日志记录而不是服务器端日志记录。您能够解决这个问题吗?您解决过这个问题吗?