Закрытие соединения 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, я не уверен, что произойдет, если служба находится в состоянии сбоя, будет ли это ошибка при закрытии соединения?
Ответы
Ответ 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();
}
Ответ 4
Использовать образец 1
Вот хорошая статья о том, почему вы не должны использовать:
http://msdn.microsoft.com/en-us/library/aa355056.aspx