WCF如何检测客户端的存在性

时间:2010-05-19 13:12:20

标签: wpf wcf service tcp

正如我的标题所写,

背景: 我有2种不同类型的应用程序(WPF-silverlight)可以互相交谈 - 医生应用程序和患者应用程序 - 但这并不意味着只运行2个应用程序,例如: 我可以运行3个医生应用程序和7个患者应用程序 并且所有这些应用程序都通过tcp连接使用wcf进行通信。 沟通是实时的(如信使应用程序)

流 每当有一个应用程序在线(运行)我在wcf注册它的连接,因为我需要让其他应用程序知道(实时)连接新客户端或新客户端断开连接。

问题: 可以让其他应用程序知道那里传入的应用程序/客户端, 但我的问题是,如何让其他应用程序知道此客户端是否已断开连接,

如果用户正确关闭应用程序(例如,单击关闭按钮),那就没问题了 - 所以在wpf中,我可以调用wcf取消注册连接,

但如果连接异常终止(例如直接拔掉电脑的电源线) 有没有办法让我知道这个客户端是否仍然连接?

当我在VS2008中使用f5并关闭时,我意识到这个问题,并再次打开并关闭(重复)然后,当我调试时,仍有很多连接存储在那里,但实际上客户端已经被破坏。 / p>

所以有人知道这个最佳解决方案吗? 例子非常感谢

我的代码段:

Dictionary<Guid, Client> Connections = new Dictionary<Guid, Client>();
// above is the variable where i put the connections
    object syncObj = new object();

    public ITcpServiceCallback CurrentCallback { get { return OperationContext.Current.GetCallbackChannel<ITcpServiceCallback>(); } }

    // this function is called when the program started
    public List<Client> ShakeHand( Client client, RoleType appType ) {
        if( GetClientsByCallback( CurrentCallback ).Count < 1 && GetClientsByID( client.ID ).Count < 1 ) {
            List<Client> retVal = new List<Client>();
            lock( syncObj ) {
                if( appType == RoleType.Doctor ) {
                    List<Client> doctors = Helpers.GetDoctor( AppDomain.CurrentDomain.BaseDirectory + "App_Data/doctor.xml" );
                    foreach( Client doctor in doctors ) {
                        doctor.Status = ConnectionStatus.Offline;
                        foreach( Client con in Connections.Values ) {
                            if( con.Role == RoleType.Doctor && con.ID == doctor.ID ) {
                                doctor.Status = ConnectionStatus.Online;
                                break;
                            }
                        }
                        retVal.Add( doctor );
                    }
                } else { //b la.. bla similiar like if above
                }

                client.Callback = CurrentCallback;
                client.Status = ConnectionStatus.Online;

                // this is the code where i add the connection
                Connections.Add( Guid.NewGuid(), client ); 

            }
            return retVal;
        }
        return null;
    }

先谢谢你

1 个答案:

答案 0 :(得分:1)

我认为您真正需要实现的是发布者/订阅者服务。所有医生和患者应用程序都有一个指向pub / sub服务的链接。当一个应用程序启动时,它会订阅该服务并开始接收来自所有其他应用程序的通知。当应用程序关闭时,它取消订阅事件。

看看这个: http://msdn.microsoft.com/en-us/library/ms752254.aspx

并且: http://msdn.microsoft.com/en-us/magazine/cc163537.aspx