Вопрос
Мы используем службу WCF
на стороне клиента мы планируем явно закрыть соединение Похоже, существует более одного способа закрытия
Образец 1:В блоке finally потребления службы WCF используйте
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
client.Close();
Поскольку, если служба находится в состоянии сбоя, мы не сможем вызвать close()
Образец 2:
using(ClientProxy proxy = new ClientProxy())
{
//call your service methods
}
в примере 2 я не уверен, что произойдет, если служба находится в состоянии сбоя, выдаст ли она ошибку при закрытии соединения?
Решение
2-й пример, использующий блок "using", неверен.Блок using гарантирует, что метод Dispose вызывается для прокси-объекта.Метод Dispose, в свою очередь, вызывает метод Close, который (попытается) подключиться к службе, которая выдаст исключение при сбое состояния связи.Так что ваши чувства / догадки абсолютно верны.Было бы неплохо, если бы метод proxy Dispose использовал код из вашего первого примера, но это не так, поэтому не используйте блок using :)
Другие советы
У вас есть вся необходимая информация под рукой - в результате наилучшей практикой для использования и надлежащего закрытия / прерывания всех ваших прокси-клиентов WCF было бы:
YourClientProxy clientProxy = new YourClientProxy();
try
{
.. use your service
clientProxy.Close();
}
catch(FaultException)
{
clientProxy.Abort();
}
catch(CommunicationException)
{
clientProxy.Abort();
}
catch (TimeoutException)
{
clientProxy.Abort();
}
Перехватывая FaultException, обрабатываются все случаи, когда служба отвечала с состоянием ошибки (и, следовательно, ваш канал находится в состоянии сбоя), а CommunicationException будет обрабатывать все другие исключения, связанные с обменом данными, которые могут возникнуть, такие как отключение сетевого подключения и т.д.
Подход с использованием блока using() не сработает, поскольку, если в конце блока произойдет исключение, когда метод Dispose() вызывает метод Close() на клиентском прокси-сервере, у вас нет способа перехватить и обработать это.
В превосходном заведении Джувала Лоуи Книга по программированию WCF он рекомендует:
try
{
ClientProxy clientProxy = new ClientProxy();
clientProxy.SomeMethod();
clientProxy.Close();
}
catch
{
proxy.Abort();
}
Используйте пример 1
Вот хорошая статья о том, почему вы не должны использовать using: