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

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

26 голосов
/ 09 сентября 2009

Мы используем сервис 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. Я не уверен, что произойдет, если служба находится в состоянии сбоя. Будет ли возникать ошибка при закрытии соединения?

Ответы [ 4 ]

34 голосов
/ 09 сентября 2009

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

18 голосов
/ 09 сентября 2009

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

4 голосов
/ 10 сентября 2009

У Ювала Лоуи Отлично Программирование книги WCF он рекомендует:

try 
{
    ClientProxy clientProxy = new ClientProxy();
    clientProxy.SomeMethod();
    clientProxy.Close();
}
catch
{
    proxy.Abort();
}
2 голосов
/ 09 сентября 2009

Использовать образец 1

Вот хорошая статья о том, почему вы не должны использовать, используя:

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

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