2011-09-25 230 views

回答

0

如果您已經在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這將意味着,連接已丟失,用戶需要重新連接(重新登錄) ;

+0

你能告訴我更多關於GetOpenSession,CreateNewSession,CloseSession和UpdateSession的信息。感謝您的幫助。 – Vero009

+0

CreateNewSession - 在最簡單的實現中,您將用戶與數據庫中的密碼進行身份驗證,並且如果成功,則使用客戶端傳遞的guid作爲唯一值在數據庫中創建會話記錄。 GetOpenSession - 使用guid查詢會話表,如果它是一個打開的會話,則返回會話對象。關閉會話 - 更新數據庫,將SessionOpen字段更改爲False。更新會話更新LastDateTimeRefreshed字段與當前日期時間(這是用戶仍然登錄時)。 –

+0

你可以給我一個簡單的例子代碼。這對我來說真的很有幫助,因爲我是WCF新手。 – Vero009

相關問題