Ошибка WCF Объект связи System.ServiceModel.Channels.ServiceChanne не может использоваться для связи, поскольку он находится в состоянии Faulted

Получаем

"Объект связи, System.ServiceModel.Channels.ServiceChannel, не может использоваться для связи, поскольку он находится в состоянии Faulted."

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

Все, что я могу сказать, когда услуга недоступна, но сборщик мусора, пытающийся уничтожить объект, объекты связи вызывают его функцию закрытия службы. Там мы получаем исключение.

Ответ 1

Когда вы задаете вопрос об исключении, вы должны опубликовать все исключение, включая все экземпляры InnerException. Вы должны поймать исключение, отобразить ex.ToString(), а затем сбросить исключение с помощью "throw":

try {
    // Do whatever causes the exception
} catch (Exception ex) {
    Console.WriteLine(ex.ToString());  // Or Debug.Print, or whatever
    throw; // So exception propagation will continue
}

В этом случае мне интересно, есть ли у вас блок-блок вокруг вашего создания прокси-сервера:

using (var proxy = new WcfProxyClient())
{
    // Use of proxy
}

В WCF есть недостаток дизайна, который делает это единственным местом в .NET, где вы не должны использовать блок использования. Вместо этого вам нужно сделать это вручную. См. http://web.archive.org/web/20100703123454/http://old.iserviceoriented.com/blog/post/Indisposable+-+WCF+Gotcha+1.aspx.

Также см. "Какое лучшее обходное решение для проблемы с блоком WCF using?" и " Indisposable WCF clients".

Ответ 2

Взгляните на проект прокси здесь.

У нас была аналогичная проблема, и этот метод ее исправил. В основном это предполагает наследование от класса, который автоматически воссоздает канал, если он неисправен.