none
WCF em Estado de Falha após varias chamadas ao serviço... RRS feed

  • Pergunta

  • Noite...

    Estou tendo o seguinte erro após realizar varias chamadas ao serviço:

    ************** Texto de Exceção **************
    System.ServiceModel.Security.MessageSecurityException: Uma falha protegida incorretamente ou não protegida foi recebida da outra parte. Veja a FaultException interna para obter detalhes do código da falha. ---> System.ServiceModel.FaultException: Não foi possível processar a mensagem. O motivo mais provável é que a ação 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT/Cancel' esteja incorreta, que a mensagem contenha um token de contexto de segurança expirado ou inválido ou que haja uma incompatibilidade entre as ligações. O token de contexto de segurança seria inválido se o serviço tivesse anulado o canal devido à inatividade. Para impedir que o serviço anule sessões ociosas prematuramente, aumente o tempo limite de Recebimento na ligação do ponto de extremidade de serviço.
       --- Fim do rastreamento de pilha de exceções internas ---

    Fiz um roteiro de testes o qual eu não utilizei Close() em nenhuma chamada após cada método, pois faria no final do teste como um todo.

    Porém.... No meio do teste o erro acima é exibido... Na maquina onde esta rodando o IIS o serviço continua normal, porém na minha máquina, não consigo mais acessar o serviço...

    Dei uma lida no post do Israel Aece sobre utilização de blocos using e fiquei na dúvida se no Client devo utilizar esses blocos using ou try catch finally com Close() e Abort()

    Fica então 1 problema e 1 dúvida no ar.

    Abs.,

    Marcel Piva
    terça-feira, 20 de outubro de 2009 23:11

Respostas

  • Boas Marcel,

    A boa prática é fazer:

    try
    {
        ...
        client.Close();
    }
    catch (CommunicationException e)
    {
        ...
        client.Abort();
    }
    catch (TimeoutException e)
    {
        ...
        client.Abort();
    }
    catch (Exception e)
    {
        ...
        client.Abort();
        throw;
    }

    Como eu disse lá, ao chamar Close, ele faz ainda faz contato com o serviço para encerrar a comunicação. Se nesse momento, um problema ocorrer, a exceção vai ser disparada, mascarando o problema.
    http://www.israelaece.com
    quarta-feira, 21 de outubro de 2009 09:34
    Moderador