0
我寫了一個使用WCF(net.tcp)的服務器/客戶端。現在我想捕獲服務器端的客戶端連接和斷開連接。如何在服務器端捕獲客戶端的連接和斷開連接?
我寫了一個使用WCF(net.tcp)的服務器/客戶端。現在我想捕獲服務器端的客戶端連接和斷開連接。如何在服務器端捕獲客戶端的連接和斷開連接?
如果您已經在WCF內部進行了微小修改的認證,可以實現此功能。
您在服務(Connect,Disconnect)上創建2個方法,其中Connect是客戶端在啓動(或登錄)時調用的第一件事,並斷開客戶端執行的最後一個方法。在服務器上記錄連接/斷開連接到數據庫或您選擇的任何其他存儲。
這很簡單,做你所需要的。但是,如果客戶端應用程序以意外的異常結束或存在網絡問題,您將不會知道它發生了。這就是爲什麼我會在名爲Refresh的服務器上添加另一個方法。這種方式會起作用 - 每次客戶端調用連接時,都會在計時器上啓動後臺線程,並每5分鐘運行一次刷新。這樣你的服務器端至少每5分鐘記錄一次客戶端的活動。另外,我會每10分鐘在計時器上創建一個在服務器上運行的Windows服務,如果有任何未刷新的連接,它會創建強制斷開連接。
因此,這是水平有多高,在服務器上的代碼將工作:
[DataContract]
public class Session
{
public string UserName { get; set; }
public byte[] passwordHash { get; set; }
public Guid sessionGuid { get; set; }
}
public bool Connect(Session sessionObject)
{
if (GetOpenSession(sessionObject.sessionGuid) == null)
{
if (CreateNewSession(sessionObject)) return true; else return false;
}
else
{
CloseSession(GetOpenSession(sessionObject.sessionGuid));
if (CreateNewSession(sessionObject)) return true; else return false;
}
}
public void Disconnect(Guid sessionGuid)
{
if (GetOpenSession(sessionGuid) != null)
{
CloseSession(GetOpenSession(sessionGuid));
}
}
public bool Refresh(Guid sessionGuid)
{
if (GetOpenSession(sessionGuid) != null)
{
UpdateSession(sessionGuid);
return true;
}
else
{
return false;
}
}
在客戶端,如果連接或刷新返回false這將意味着,連接已丟失,用戶需要重新連接(重新登錄) ;
你能告訴我更多關於GetOpenSession,CreateNewSession,CloseSession和UpdateSession的信息。感謝您的幫助。 – Vero009
CreateNewSession - 在最簡單的實現中,您將用戶與數據庫中的密碼進行身份驗證,並且如果成功,則使用客戶端傳遞的guid作爲唯一值在數據庫中創建會話記錄。 GetOpenSession - 使用guid查詢會話表,如果它是一個打開的會話,則返回會話對象。關閉會話 - 更新數據庫,將SessionOpen字段更改爲False。更新會話更新LastDateTimeRefreshed字段與當前日期時間(這是用戶仍然登錄時)。 –
你可以給我一個簡單的例子代碼。這對我來說真的很有幫助,因爲我是WCF新手。 – Vero009