У меня долгая история с использованием WCF, но я понял, что я всегда повторяю одни и те же вещи снова и снова (и, очевидно, то же самое для других коллег-разработчиков, которые используют WCF).Например, я использую его для простого недуплексного клиента:
try
{
Channel.MyMethod();
}
catch
{
//a LOT of various communications errors, which just annoying to handle and almost always simple disconnect
}
Я также делаю это как void Invoke (Action action) метод, который воссоздает канал, если он находится в Failedгосударство.Для дуплекса это намного хуже , потому что мне всегда нужно заботиться о том, чтобы проверить, есть ли еще соединение, иначе оно может просто ... зависнуть навсегда.Я делаю это, вызывая заглушку heartbeat:
Channel.Heartbeat();
И когда возникает ошибка связи, я вызываю OnFaults в обратном вызове
Callback.OnFaulted(...);
И если вы подумали об использовании сбойного события на Channel и ChannelFactoryвы совершенно не правы:
client = new Client();
((ICommunicationObject)client).Faulted += new EventHandler(client_Faulted);
да, он работает ... иногда, а иногда он все равно будет зависать, потому что это событие не гарантируется при отключении, инициированном сервером.
Итак, явсегда видеть эти проблемы в WCF:
- Воссоздание Channel / ChannelFactory (оба могут быть в состоянии Failed) для простого одностороннего клиента.
- Работа с большим количеством вариаций Communcation / Socket/ Timeout / Какие бы исключения WCF ни выбрасывал на клиенте.Они не описывают причину без включения трассировок WCF.
- Работа с проверкой состояния связи вручную при использовании дуплексных соединений (в отдельной задаче, вызов Heartbeat).
- Подписка на скрытые интерфейсы ICommunicationObject (что кажетсябесполезно, потому что не работает должным образом)
- Повторите работу с теми же исключениями на стороне сервера при использовании дуплекса.
Есть ли библиотека / прокси-компоновщик или прекрасный пример того, как следует обращаться со всемииз этих проблем в один ход?Лично это действительно раздражает, что прокси, сгенерированный VS, просто не работает в рабочем коде.