Pergunta
Estamos usando o serviço WCF
no lado do cliente, estamos planejando para fechar explicitamente a conexão Parece que há mais de uma maneira de fechamento
Sample1: No último bloco do uso do consumo serviço WCF
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
client.Close();
Uma vez que se o serviço está em estado de falha não será capaz de chamar close ()
Sample2:
using(ClientProxy proxy = new ClientProxy())
{
//call your service methods
}
em sample2 Não estou certo o que vai acontecer se o serviço está em estado de falha, vai jogar erro fechar a conexão?
Solução
O segundo exemplo usando o "usando" bloco está incorreto. Os utilizando garante bloco que o método é chamado Descarte no objecto de proxy. O método Dispose por sua vez chama o método Close, que vai (tentar) se conectar ao serviço que irá lançar uma exceção quando o estado de comunicação é criticada. Então seus sentimentos / palpite está absolutamente certo. Seria bom se o método Dispose proxy usado o código de sua primeira amostra, mas não por isso não use o bloco usando:)
Outras dicas
Você tem todas as informações necessárias à mão - o Best Practice resultante para uso e devidamente fechar / abort todos os seus proxies cliente WCF seria:
YourClientProxy clientProxy = new YourClientProxy();
try
{
.. use your service
clientProxy.Close();
}
catch(FaultException)
{
clientProxy.Abort();
}
catch(CommunicationException)
{
clientProxy.Abort();
}
catch (TimeoutException)
{
clientProxy.Abort();
}
Travando a FaultException lida com todos os casos quando o serviço responsded com uma condição de erro (e, portanto, o seu canal está em um estado de falha), e CommunicationException vai lidar com todas as outras exceções relacionadas à comunicação que podem ocorrer, como conectividade de rede cair etc.
A abordagem com o uso de bloco () não funcionará, pois se uma exceção acontece no final do bloco, quando o método Dispose () chama o método Close () no proxy do cliente, você não tem como captura e manipulação isso.
O Em Juval Lowy Excelente Programação livro WCF ele recomenda:
try
{
ClientProxy clientProxy = new ClientProxy();
clientProxy.SomeMethod();
clientProxy.Close();
}
catch
{
proxy.Abort();
}
Use amostra 1
Aqui está um bom artigo sobre o porquê você não deve usar usando: