none
Chat utilizando serviço WCF RRS feed

  • Pergunta

  • Pessoal,

    Estou tentando desenvolver uma Chat para atendimento a usuários utilizando serviços WCF e Silverlight.

    O projeto está dividido em tres partes:

    1-Serviço WCF hospedado no IIS

    2-Aplicação client em Silverlight utilizada pelo Analista de Suporte para conectar ao serviço e conversar com o usuário

    4-Aplicação client em WPF (que poderia também ser Silverlight) utilizada pelo cliente para conversar com um Analista de Suporte

    A comunicação entre estas partes já está sendo realizada, mas estou com um problema referente a inatividade. Nos testes, quando não há nenhuma ação por mais ou menos uns 10 minutos, o serviço WCF fica indisponível e me retorna a exceção com a mensagem a seguir:

    The communication object, System.ServiceModel.Channels.ClientFramingDuplexSessionChannel, cannot be used for communication because it is in the Faulted state.

    As características do meu serviço são:

    1-Não declara explicitamente um gerenciamento de instâncias, está utilizando o padrão do WCF

    2-Utiliza wsDualHttpBinding no endpoint

     

    Alguém tem idéia do que pode estar causado esse problema?

    Obrigado

    Marcos

    quarta-feira, 17 de novembro de 2010 18:13

Respostas

  • Boas Marcos,

    O que pode estar influenciando é a Reliable Session/Message. Se nenhuma mensagem for transmitida (incluindo mensagens de infraestrutura, como acknowledgements) durante o intervalo de tempo determinado por essa propriedade, a sessão será descartada e, quando omitido, o valor padrão é 10 minutos. Quando você faz uso das realiable messages, é importante que as propriedades InactivityTimeout e ReceiveTimeout estejam sincronizadas, pois do contrário, não ter a propriedade InactivityTimeout maior que ReceiveTimeout, não evitará o termino da sessão.

    Para configurar o binding no modelo declarativo, poderá fazer da seguinte forma:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <bindings>
          <wsDualHttpBinding>
            <binding name="bindingConfig">
              <reliableSession ordered="false" inactivityTimeout="01:00:00"/>
            </binding>
          </wsDualHttpBinding>
        </bindings>
      </system.serviceModel>
    </configuration>


    http://www.israelaece.com
    quinta-feira, 18 de novembro de 2010 10:15
    Moderador

Todas as Respostas

  • Boas Marcos,

    O que pode estar influenciando é a Reliable Session/Message. Se nenhuma mensagem for transmitida (incluindo mensagens de infraestrutura, como acknowledgements) durante o intervalo de tempo determinado por essa propriedade, a sessão será descartada e, quando omitido, o valor padrão é 10 minutos. Quando você faz uso das realiable messages, é importante que as propriedades InactivityTimeout e ReceiveTimeout estejam sincronizadas, pois do contrário, não ter a propriedade InactivityTimeout maior que ReceiveTimeout, não evitará o termino da sessão.

    Para configurar o binding no modelo declarativo, poderá fazer da seguinte forma:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <bindings>
          <wsDualHttpBinding>
            <binding name="bindingConfig">
              <reliableSession ordered="false" inactivityTimeout="01:00:00"/>
            </binding>
          </wsDualHttpBinding>
        </bindings>
      </system.serviceModel>
    </configuration>


    http://www.israelaece.com
    quinta-feira, 18 de novembro de 2010 10:15
    Moderador
  • Israel,

    Era este mesmo o problema, alterei a configuração dos bindings, os mesmos ficaram assim:

     

             <netTcpBinding>

                <binding name="BindingTCP" receiveTimeout="01:00:00">

                   <reliableSession ordered="false" inactivityTimeout="01:00:00"/>

                   <security mode="None"/>

                </binding>

             </netTcpBinding>

     

             <wsDualHttpBinding>

                <binding name="BindingHttpDual" receiveTimeout="01:00:00">

                   <reliableSession ordered="false" inactivityTimeout="01:00:00"/>

                   <security mode="None"/>

                </binding>

             </wsDualHttpBinding>


    Não sei há necessidade de fazer alteração nos dois tipos de binding, mas desta forma funcionou.

    Obrigado pela ajuda

    Marcos

    sexta-feira, 19 de novembro de 2010 10:36
  • Israel,

     

    Acabei me esquecendo de perguntar outra coisa no post anterior, referente ao meio utilizado para se criar um chat, o que você acha melhor (mais simples), utilizar WCF ou utilizar Socket ?

     

    Pergunto isso por que encontrei diversas formas de fazer isso tanto em WCF com Silverlight/WPF quanto utilizando Socket também com Silverlight/WPF. Acredito que o WCF seja muito mais aperfeiçoado que o Socket, mas no meu caso, este chat é algo que não deve ser tão complexo. Daí surgiu a dúvida.

     

    Marcos

    sexta-feira, 19 de novembro de 2010 13:08
  • Boas Marcos,

    Acredito que Sockets talvez tenham uma performance melhor, mas o problema é que você precisa lidar diretamente com o protocolo, o que é pouco produtivo e exige um conhecimento detalhado de como funciona.

    Acho que o "overhead" que o WCF insere, em grande parte dos cenários, não é um problema.


    http://www.israelaece.com
    terça-feira, 23 de novembro de 2010 12:16
    Moderador