.net 如何捕获客户';s服务器端的连接和断开连接?

.net 如何捕获客户';s服务器端的连接和断开连接?,.net,wcf,wcf-client,net.tcp,.net,Wcf,Wcf Client,Net.tcp,我已经使用WCF(net.tcp)编写了一个服务器/客户机。现在,我想在服务器端捕获客户端的连接和断开连接。如果您在WCF中构建了身份验证,只需稍加修改即可实现 您在服务上创建了两个方法(Connect,Disconnect),其中Connect是客户端在启动(或登录)时调用的第一个方法,Disconnect是客户端执行的最后一个方法。在服务器上,记录与数据库或您选择的任何其他存储的连接/断开 这很简单,可以满足您的需要。但是,如果客户端应用程序以意外异常结束,或者存在网络问题,您将不知道它发生

我已经使用WCF(net.tcp)编写了一个服务器/客户机。现在,我想在服务器端捕获客户端的连接和断开连接。

如果您在WCF中构建了身份验证,只需稍加修改即可实现

您在服务上创建了两个方法(Connect,Disconnect),其中Connect是客户端在启动(或登录)时调用的第一个方法,Disconnect是客户端执行的最后一个方法。在服务器上,记录与数据库或您选择的任何其他存储的连接/断开

这很简单,可以满足您的需要。但是,如果客户端应用程序以意外异常结束,或者存在网络问题,您将不知道它发生了。这就是为什么我要在服务器上添加另一个名为Refresh的方法。工作原理是:每次客户端调用connect时,您都会在计时器上启动一个后台线程,并每5分钟运行一次刷新。这样,服务器端至少每5分钟记录一次客户端的活动。另外,我会创建一个Windows服务,每10分钟在服务器上运行一次,如果有任何未刷新的连接,它会创建一个强制断开连接

这就是服务器上的高级代码的工作方式:

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

在客户端上,如果Connect或Refresh返回false,则表示连接已丢失,用户需要重新连接(重新登录)

你能告诉我更多关于GetOpenSession、CreateNewSession、CloseSession和UpdateSession的信息吗。感谢您的帮助。CreateNewSession-在最简单的实现中,您可以根据数据库中的密码对用户进行身份验证,如果成功,您可以使用客户端传递的guid作为唯一值在数据库中创建会话记录。GetOpenSession-使用guid查询sessions表,如果是打开的会话,则返回会话对象。关闭会话-更新数据库,将SessionOpen字段更改为False。更新会话使用当前日期时间更新LastDateTimeRefreshed字段(此时用户仍在登录)。您能给我一个简单的代码示例吗。这对我很有帮助,因为我是WCF的新手。