Ошибка WCF Объект связи, System.ServiceModel.Channels.ServiceChanne, не может использоваться для связи, поскольку он находится в состоянии Failed - PullRequest
11 голосов
/ 13 апреля 2009

Получаем

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

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

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

Ответы [ 2 ]

12 голосов
/ 13 апреля 2009

Когда вы задаете вопрос об исключении, вы должны опубликовать все исключение, включая все экземпляры 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 * Проблема блока 1015 *? » и « Незаменимые клиенты WCF ».

0 голосов
/ 13 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...