Вы сделали ненужные выводы.
Проблема WCF - недостаток дизайна. Microsoft облажалась. Такое бывает иногда.
У меня больше нет ссылки, но я нашел ее при помощи поиска, и вы тоже можете. Во время разработки WCF был момент, когда возник вопрос: «должен ли Dispose () всегда вызывать Close ()». Когда вопрос пришел к Дону Боксу (главный архитектор WCF или что-то подобное), он «не мог придумать ни одной причины, почему бы и нет». Он пропустил причину, почему бы и нет.
Dispose () не должен выдавать исключения. Это из-за следующего:
try
{
var proxy = null;
try
{
proxy = new ProxyClass();
throw new Exception1();
}
finally
{
if (proxy != null) proxy.Dispose(); // What happens if this throws Exception2?
}
}
catch (Exception ex)
{
// Which exception do I see in here?
}
Если Dispose()
сгенерирует Exception2
, то я потеряю Exception1
вместе с трассировкой стека, показывающей, что произошло. Проблема в том, что мистер Бокс не нашел причины, по которой Dispose () не должен просто вызывать Close()
для выполнения этой работы. Проблема в том, что с некоторыми привязками Close()
фактически должен выполнять некоторую работу. Это имеет место с wsHttpBinding, где происходит обмен сообщениями при Close()
. Это означает, что у вас есть реальный шанс Close()
вызвать исключение и уничтожить мой стек вызовов.