2015-05-29 38 views
0

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

有沒有日誌時,我關機或重新啓動站點。

回答

0

去這個線程讀取...下面的延續......也沒有必要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

您確定哪個用戶在系統上連接了系統連接事件..並存儲所有聊天是本地分貝 –

0

原因是:

關閉iis後關閉了客戶端瀏覽器嗎?

我可以告訴你,即使你關閉了iis,客戶端仍在連接。

由於信號客戶端html文件不需要託管在iis中,它甚至可以連接它,即使它託管在客戶端。

+0

這不是一個HTML頁面。我的signalR客戶端在Global.asax中啓動。 – wtf512

+0

你是否關閉瀏覽器?當瀏覽器沒有關閉時它仍然應該連接 –

相關問題