WCF как определить существование клиента - PullRequest
2 голосов
/ 19 мая 2010

Как написано в моем названии,

фон: У меня есть 2 разных типа приложений (WPF-silverlight), которые могут общаться друг с другом - приложение «Доктор» и приложение «Пациент», но это не значит, что будут запущены только 2 приложения, например: я могу запустить приложение 3 доктора и приложение 7 пациентов. и все эти приложения общаются с помощью wcf через tcp соединение. общение в режиме реального времени (например, приложение мессенджера)

поток каждый раз, когда приложение онлайн (запускается), я регистрирую его соединение на wcf, потому что мне нужно сообщить другим приложениям (в режиме реального времени), что подключен новый клиент или отключен новый клиент.

Проблема: нормально сообщить другому приложению, что есть входящее приложение / клиент, но моя проблема в том, как сообщить другому приложению, если этот клиент был отключен,

нормально, если пользователь правильно закроет приложение (например, нажмите кнопку закрытия) - поэтому в wpf я могу вызвать wcf для отмены регистрации соединения,

но как, если соединение было прервано ненормально (например, напрямую отключите кабель питания вашего компьютера) могу ли я узнать, что этот клиент все еще подключен или нет?

Я осознаю эту проблему, когда я нажимаю f5 в моем VS2008 и закрываюсь, и снова открываю и закрываю (повторяю), а затем, когда я отлаживаю, там сохраняется много соединений, но на самом деле клиент уже разрушен.

так кто-нибудь знает это лучшее решение? пример высоко ценится

мой фрагмент кода:

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 Ответ

1 голос
/ 26 июня 2010

Я думаю, что вам действительно нужно реализовать сервис издателя / подписчика. Все приложения для врачей и пациентов имеют ссылку на паб / суб-сервис. Когда запускается одно приложение, оно подписывается на сервис и начинает получать уведомления от всех других приложений. Когда приложение закрывается, оно отписывается от событий.

Взгляните на это: http://msdn.microsoft.com/en-us/library/ms752254.aspx

и это: http://msdn.microsoft.com/en-us/magazine/cc163537.aspx

...