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

时间:2015-05-29 06:35:48

标签: c# iis signalr

我将IIS中的signalR客户端作为网站托管。 我测试了从服务器发送消息给这个客户端,它运行正常。

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

再次,我向该客户发送消息,它仍然有效。

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

BTW,我有状态改变事件回调方法

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);
}

关闭或重新启动网站时没有日志。

2 个答案:

答案 0 :(得分:0)

转到这个线程阅读...下面的继续...也没有必要onstatechange事件...阅读msdn链接它将更有助于you

如何处理Hub类中的连接生命周期事件

处理连接生命周期事件的典型原因是跟踪用户是否已连接,以及跟踪用户名和连接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方法。当客户端断开连接并且SignalR无法自动重新连接时,例如当浏览器导航到新页面时,将调用OnDisconnected方法。因此,给定客户端的可能事件序列是OnConnected,OnReconnected,OnDisconnected;或OnConnected,OnDisconnected。对于给定的连接,您将看不到序列OnConnected,OnDisconnected,OnReconnected。

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

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

来电状态未填充

从服务器调用连接生存期事件处理程序方法,这意味着您放在客户端上的状态对象中的任何状态都不会填充在服务器上的Caller属性中。有关状态对象和调用者属性的信息,请参阅本主题后面的如何在客户端和Hub类之间传递状态。

如何从Context属性

获取有关客户端的信息

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

主叫客户端的连接ID。

string connectionID = Context.ConnectionId;

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

答案 1 :(得分:0)

原因是:

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

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

因为信号器客户端html文件不需要在iis中托管,所以它甚至可以连接在客户端托管。