Faulted
- это одно из состояний конечного автомата CommunicationObject
, которое встроено в реализацию многих абстракций WCF. По сути, это означает «игра окончена» для этого объекта, поэтому вы не найдете способа отключить его.
Это, конечно, не ошибка: конечный автомат CommunicationObject
, лежащий в основе всех этих артефактов, был осознанным выбором дизайна. Хотя это может представлять интерес для обсуждения проектных решений, принятых архитекторами WCF, в конечном счете, вам просто нужно признать, что все так и происходит, если вы хотите использовать WCF.
Вы должны думать о канале как о чем-то большем, чем просто адаптер для используемого транспорта: это абстракция более высокого уровня, которая объединяет несколько различных уровней в стеке связи (транспорт, кодирование, безопасность, управление сеансами, поток транзакций, дуплекс и т. д.).
Даже глядя на детали конкретных привязок, вы обнаружите очень мало элементов стека, которые являются отказоустойчивыми в той степени, в которой вы могли бы безопасно использовать их после неудачной попытки предыдущей связи (например, HTTP-протокол). Даже те, которые вы упоминаете (TCP, Named Pipes), не так отказоустойчивы, как вы предлагаете.
Я думаю, что конечный автомат CommunicationObject
, или что-то в этом роде, более или менее необходим для того, чтобы иметь абстракцию канала, которая работает на более высоком уровне, чем мельчайшие детали всех составляющих ее слоев / элементов. Это включает простое правило: если это Faulted
, выбросьте его и создайте новое. Да, может быть несколько случаев, когда при этом вы пропускаете оптимизацию, которая была бы возможна при сохранении некоторого ресурса, который можно было бы безопасно использовать повторно; но это (небольшая) стоимость, которую вы платите за работу с гораздо более простой абстракцией ваших коммуникаций.