Подтвердить что ты не робот

Закрытие соединения WCF

Мы используем службу WCF

на стороне клиента мы планируем явно закрыть соединение Кажется, есть более чем один способ закрытия

Sample1: В блоке finally использования потребления WCF используйте

if (client.State == CommunicationState.Faulted)
{
  client.Abort();
}
client.Close();

Так как если служба находится в состоянии сбоя, мы не сможем вызвать close()

Sample2:

using(ClientProxy proxy = new ClientProxy())
{   
  //call your service methods
}

в sample2, я не уверен, что произойдет, если служба находится в состоянии сбоя, будет ли это ошибка при закрытии соединения?

4b9b3361

Ответ 1

2-й пример с использованием блока "использование" неверен. Блок использования гарантирует, что метод Dispose вызывается в прокси-объекте. Метод Dispose в свою очередь вызывает метод Close, который (попытается) подключиться к службе, которая будет генерировать исключение, когда состояние связи будет сбой. Поэтому ваши чувства/догадки абсолютно правильны. Было бы неплохо, если бы метод proxy Dispose использовал код из вашего первого образца, но он не использует этот блок:)

Ответ 2

У вас есть вся необходимая информация - полученная в результате Лучшая практика для использования и надлежащего закрытия/прерывания всех ваших прокси-серверов 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() на прокси-сервере клиента, у вас нет способа ловить и обрабатывать это.

Ответ 3

В Juval Lowy Отлично Программирование WCF-книги он рекомендует:

try 
{
    ClientProxy clientProxy = new ClientProxy();
    clientProxy.SomeMethod();
    clientProxy.Close();
}
catch
{
    proxy.Abort();
}