Вы находитесь на правильном пути, я бы сказал ;-)
В принципе, создание прокси клиента 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
Как насчет закрытия канала? – Burt
Спасибо, это немного разобрало, мне действительно нужно купить книгу WCF (любые рекомендации будут приветствоваться). – Burt
Почему улов и, наконец, по сути дела делают то же самое, т. Е. ComObj.Abort? Есть ли необходимость в прерывании в уловах? – Burt