Метод .Close()
попытается корректно закрыть соединение, например, ожидающий вызов все равно будет завершен сервером, и только после этого соединение будет прервано.Используйте это всякий раз, когда это возможно - это мягкий и предпочтительный способ закрытия клиентского соединения.
.Abort()
на самом деле просто разрывает канал связи - независимо от того, идет ли вызов или нет.Это окончательный аварийный люк в крайнем случае, если ошибка .Close()
не удалась.
В качестве наилучшей практики я бы обернул свои сервисные вызовы в блок try...catch
, примерно такой:
try
{
myServiceClient.CallSomeMethod();
myServiceClient.Close();
}
catch(FaultException<SomeError>)
{
myServiceClient.Abort();
}
// possibly other catch clauses, too - call .Abort() inside them
catch(CommunicationException)
{
myServiceClient.Abort();
}