Время жизни клиента службы WCF - PullRequest
8 голосов
/ 14 марта 2010

У меня есть приложение WPF, которое использует службы WCF для совершения звонков на сервер.

Я использую это свойство в своем коде для доступа к услуге

private static IProjectWcfService ProjectService
{
    get
    {
        _projectServiceFactory = new ProjectWcfServiceFactory();
        return _projectServiceFactory.Create();
    }
}

Создать на заводе выглядит так

    public IProjectWcfService Create()
    {
        _serviceClient = new ProjectWcfServiceClient();

        //ToDo: Need some way of saving username and password 
        _serviceClient.ClientCredentials.UserName.UserName = "MyUsername";
        _serviceClient.ClientCredentials.UserName.Password = "MyPassword";

        return _serviceClient;
    }

Для доступа к методам обслуживания я использую что-то вроде следующего.

ProjectService.Save(dto);

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

Какова будет наилучшая практика для клиента службы WCF для вызовов WPF?

Заранее спасибо ...

1 Ответ

12 голосов
/ 14 марта 2010

Я бы сказал, что вы на правильном пути; -)

По сути, создание клиентского прокси WCF является двухэтапным процессом:

  • создать фабрику каналов
  • из фабрики каналов, создайте фактический канал

Шаг # 1 довольно «дорогой» с точки зрения времени и усилий, поэтому неплохо сделать это один раз, а затем кэшировать экземпляр ProjectWcfServiceFactory где-нибудь в вашем коде.

Шаг № 2 на самом деле довольно легкий, и поскольку канал между клиентом и службой может перейти в «ошибочное состояние», когда на сервере возникает исключение (а затем его необходимо заново создать), кэширование реальный канал сам по себе менее желателен.

Таким образом, общепринятая лучшая практика будет:

  • создайте ChannelFactory<T> (в вашем случае: ProjectWcfServiceFactory) один раз и кэшируйте его как можно дольше; выполнять эту тяжелую работу только один раз

  • создайте фактический Channel (здесь: IProjectWcfService) по мере необходимости перед каждым вызовом. Таким образом, вам не нужно беспокоиться о проверке его состояния и воссоздании его по мере необходимости

ОБНОВЛЕНИЕ:"А как насчет закрытия канала?" спрашивает Берт ;-) Хороший вопрос !!

Приемлемая лучшая практика для этого заключается в том, чтобы заключить ваш сервисный вызов в блок try....catch....finally. Сложность в том, что при утилизации канала тоже все может пойти не так, так что вы можете получить исключение - поэтому обернуть его в блок using(....) недостаточно.

В общем, у вас есть:

IProjectWcfService client = ChannelFactory.CreateChannel();
try
{
   client.MakeYourCall();
}
catch(CommunicationException ce)
{
    // do any exception handling of your own
}
finally
{
    ICommunicationObject comObj = ((ICommunicationObject)client);

    if(comObj.State == CommunicationState.Faulted)
    {
       comObj.Abort();
    }   
    else
    {
       comObj.Close();
    }
}

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

ОБНОВЛЕНИЕ:

Книга, которую я всегда рекомендую, чтобы быстро приступить к работе в WCF: Изучение WCF Мишелем Леру Бустаманте. Она охватывает все необходимые темы и очень понятным и доступным способом. Это научит вас всему - основам, промежуточным темам, безопасности, управлению транзакциями и т. Д. - что вам необходимо знать, чтобы писать высококачественные и полезные службы WCF.

Обучение WCF http://ecx.images -amazon.com / images / I / 41wYa% 2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click, TopRight, 35, -76_AA240_SH20_OU01_.jpg

Более сложные темы и более глубокий взгляд на WCF будут освещены в Программирование служб WCF Ювала Лоуи. Он действительно углубляется во все технические детали и темы и представляет «библию» для программирования WCF.

Programming WCF Services

...