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?

Foi útil?

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:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top