Вопрос

Мы используем службу 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:

http://msdn.microsoft.com/en-us/library/aa355056.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top