Microsoft говорит, что вам всегда нужно закрывать соединение в конце (см. пример в MSDN). В этой статье об обработке утилизации WCF я нашел следующий шаблон:
WCFServiceClient c = new WCFServiceClient();
try
{
c.HelloWorld();
}
catch
{
// acknowledge the Faulted state and transition to Closed
c.Abort();
// handle or throw
throw;
}
finally
{
c.Close();
}
В статье говорится, что вы должны избегать using
, поскольку он не закрывается должным образом и не удаляет объект клиента службы WCF, вместо этого вы должны сделать это с помощью блока try ... catch ... finally
, как показано выше - таким образом вы Вы имеете дело с исключениями (которые прервут, а затем повторно сгенерируют или обработают исключение), а также вы позаботитесь о окончательном закрытии соединения. Это также четко указано в советах Microsoft по устранению неполадок WCF.
Примечание: c.Close()
в finally
не приносит никакого вреда в случае исключения (состояние ошибки), потому что мы вызываем c.Abort()
до того, как исключение будет переброшено, поэтому c.Close()
фактически ничего не делает в этом случае. Однако, если исключение не происходит, тогда c.Close()
фактически выполняется нормально, и соединение закрывается, как и ожидалось.
Если ваша служба WCF ведет себя странным образом, есть много (других) причин, которые могут вызвать это - здесь вы можете найти некоторые подсказки по отладке.