如何在服务器端捕获客户端的连接和断开连接?

问题描述:

我写了一个使用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这将意味着,连接已丢失,用户需要重新连接(重新登录) ;

+0

你能告诉我更多关于GetOpenSession,CreateNewSession,CloseSession和UpdateSession的信息。感谢您的帮助。 – Vero009

+0

CreateNewSession - 在最简单的实现中,您将用户与数据库中的密码进行身份验证,并且如果成功,则使用客户端传递的guid作为唯一值在数据库中创建会话记录。 GetOpenSession - 使用guid查询会话表,如果它是一个打开的会话,则返回会话对象。关闭会话 - 更新数据库,将SessionOpen字段更改为False。更新会话更新LastDateTimeRefreshed字段与当前日期时间(这是用户仍然登录时)。 –

+0

你可以给我一个简单的例子代码。这对我来说真的很有帮助,因为我是WCF新手。 – Vero009