2010-03-14 2 views
8

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

Я использую это свойство в моем коде, чтобы получить доступ к службе

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

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

ProjectService.Save(dto); 

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

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

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

ответ

11

Вы находитесь на правильном пути, я бы сказал ;-)

В принципе, создание прокси клиента WCF процесс состоит из двух этапов:

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

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

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

Так общепринятая практика лучше было бы:

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

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

UPDATE: «что о закрытии канала» спрашивает Берт ;-) Хорошая точка !!

Приобретенная передовая практика заключается в том, чтобы обернуть ваш служебный вызов в блок 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(); 
    } 
} 

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

UPDATE:

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

Learning 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 будет покрыт Programming WCF Services по Ювалю Лоуи. Он действительно погружается во все технические детали и темы и представляет «библию» для программирования WCF.

Programming WCF Services http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

+0

Как насчет закрытия канала? – Burt

+0

Спасибо, это немного разобрало, мне действительно нужно купить книгу WCF (любые рекомендации будут приветствоваться). – Burt

+0

Почему улов и, наконец, по сути дела делают то же самое, т. Е. ComObj.Abort? Есть ли необходимость в прерывании в уловах? – Burt