为什么SignalR客户端ConnectionState在我关闭站点然后重新启动时不会改变?

问题描述:

我将IIS中的signalR客户端作为网站托管。 而我测试了从服务器发送消息到这个客户端,它工作正常。为什么SignalR客户端ConnectionState在我关闭站点然后重新启动时不会改变?

然后我关闭客户端站点,并在10分钟后重新启动它

再次,我发送消息给这个客户端,它仍然有效。

我的问题是为什么连接状态没有变化

顺便说一句,我有状态改变事件的回调方法

connection.StateChanged += (x) => { 
    OnStateChange(connectionId, x); 
}; 

private void OnStateChange(string connectionId, StateChange stateChange) 
{ 
    StringBuilder text = new StringBuilder(); 
    text.Append("ConnectiId:").Append(connectionId).Append(Environment.NewLine); 
    text.Append("OldState:").Append(stateChange.OldState.ToString()).Append(Environment.NewLine); 
    text.Append("NewState:").Append(stateChange.NewState.ToString()).Append(Environment.NewLine); 
    if(stateChange.NewState == ConnectionState.Disconnected) 
    { 
     //reconnect 
    } 
    Util.Log("signalR_statechange", text.ToString(), false); 
} 

有没有日志时,我关机或重新启动站点。

去这个线程读取...下面的延续......也没有必要onstatechange事件......阅读MSDN链接它会更有助于为you

如何处理连接寿命事件集线器类

处理连接生存期事件的典型原因是跟踪用户是否已连接,并跟踪用户名和连接ID之间的关联。要在客户端连接或断开连接时运行自己的代码,请覆盖Hub类的OnConnected,OnDisconnected和OnReconnected虚拟方法,如下例所示。

public class ContosoChatHub : Hub 
{ 
    public override Task OnConnected() 
    { 
     // Add your own code here. 
     // For example: in a chat application, record the association between 
     // the current connection ID and user name, and mark the user as online. 
     // After the code in this method completes, the client is informed that 
     // the connection is established; for example, in a JavaScript client, 
     // the start().done callback is executed. 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     // Add your own code here. 
     // For example: in a chat application, mark the user as offline, 
     // delete the association between the current connection id and user name. 
     return base.OnDisconnected(); 
    } 

    public override Task OnReconnected() 
    { 
     // Add your own code here. 
     // For example: in a chat application, you might have marked the 
     // user as offline after a period of inactivity; in that case 
     // mark the user as online again. 
     return base.OnReconnected(); 
    } 
} 

当OnConnected,OnDisconnected,和OnReconnected称为

每当浏览器导航到一个新的页面,一个新的连接已经被建立,这意味着SignalR将执行OnDisconnected方法,接着是OnConnected方法。当建立新的连接时,SignalR始终创建一个新的连接ID。

当SignalR可以自动恢复的连接暂时中断时,例如在连接超时之前暂时断开连接并重新连接时,将调用OnReconnected方法。 OnDisconnected方法在客户端断开连接并且SignalR不能自动重新连接时调用,例如当浏览器导航到新页面时。因此,给定客户端的一系列可能的事件是OnConnected,OnReconnected,OnDisconnected;或者OnConnected,OnDisconnected。您不会看到给定连接的OnConnected,OnDisconnected,OnReconnected序列。

OnDisconnected方法在某些情况下不会被调用,例如服务器关闭或应用程序域被回收时。当另一台服务器联机或应用程序域完成其回收时,某些客户端可能能够重新连接并触发OnReconnected事件。

有关更多信息,请参阅了解和处理SignalR中的连接生命周期事件。

来电显示状态不填充

连接寿命事件处理方法从服务器,这意味着,你把状态对象在客户端上的任何国家不会在来电属性来填充在服务器上被称为。有关状态对象和调用者属性的信息,请参阅本主题后面的如何在客户端和Hub类之间传递状态。

如何获得来自Context属性

客户信息要获得有关客户的信息,使用集线器类的Context属性。 Context属性返回一个HubCallerContext对象,该对象提供对以下信息的访问:

调用客户端的连接ID。

string connectionID = Context.ConnectionId; 

连接ID是一个由SignalR分配的GUID(不能在自己的代码中指定值)。每个连接都有一个连接ID,如果您的应用程序中有多个集线器,则所有集线器使用相同的连接ID。

+0

但是这篇文章仍然没有解释为什么客户端在我关闭IIS站点后没有重新连接或断开连接 – wtf512

+0

您需要在客户端连接ID中添加客户端浏览器的cookie,然后只有 –

+0

您确定哪个用户在系统上连接了系统连接事件..并存储所有聊天是本地分贝 –

原因是:

关闭iis后关闭了客户端浏览器吗?

我可以告诉你,即使你关闭了iis,客户端仍在连接。

由于信号客户端html文件不需要托管在iis中,它甚至可以连接它,即使它托管在客户端。

+0

这不是一个HTML页面。我的signalR客户端在Global.asax中启动。 – wtf512

+0

你是否关闭浏览器?当浏览器没有关闭时它仍然应该连接 –