WCF: использование дуплекса для уведомлений между несколькими экземплярами одной и той же службы WCF - PullRequest
0 голосов
/ 27 апреля 2009

Каков наилучший из возможных способов совместного использования одного экземпляра службы WCF (класс SoapClient) между несколькими экземплярами приложения (WPF)?

Мне нужно сделать это, потому что мне нужно включить двустороннюю связь с обратными вызовами, поэтому мне нужно «зарегистрировать приложение» в службе, чтобы другие пользователи, использующие приложение, получали уведомление при каждом входе нового пользователя.


Кстати, ниже вычеркнуто, потому что я подтвердил, что для работы уведомлений владельцы регистраций должны зарегистрироваться в том же экземпляре службы wcf ... таким образом, теперь мне нужен способ поделиться этим экземпляром

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

Я пытался использовать дуплекс WCF, но я не могу заставить его работать ... и я думаю, что причина этого в том, что уведомления и подписки должны происходить на один и тот же экземпляр службы WCF.

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

Есть ли способ поделиться общим экземпляром службы wcf (SoapClient) для всех пользователей? Или я поступаю неправильно?

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


Ниже перечислены методы (в библиотеке классов), которые клиентское приложение (приложение wpf) использует для получения доступа к методам службы:

public static MusicRepo_DBAccess_ServiceClient GetService(object instanceContext)
{
    return new MusicRepo_DBAccess_ServiceClient(new InstanceContext(instanceContext), dualBinding, endpointAddress);  
}

public static MusicRepo_DBAccess_ServiceClient GetService()
{
    return new MusicRepo_DBAccess_ServiceClient(new InstanceContext(new WSGateway()), dualBinding, endpointAddress);
}

В главном окне приложения я получаю новый экземпляр из вышеупомянутого перегруженного метода, передавая this в качестве параметра instanceContext и Open для ожидания уведомлений, но я никогда не получаю уведомление, когда другой пользователь регистрируется из другого экземпляра приложения.

Вот как я уведомляю регистраторов (отрывок) в методе входа в службу:

if (!_callbackList.Contains(newUser))
{
     _callbackList.Add(newUser);
 }
 _callbackList.ForEach(c => c.NotifyNewUserOnline(loggedInUser));

1 Ответ

0 голосов
/ 02 мая 2009

Решение было простым. Все, что мне нужно было изменить InstanceContextMode на Single:

[ServiceBehavior(
        InstanceContextMode = InstanceContextMode.Single)]
...