Usuário com melhor resposta
Chat utilizando serviço WCF

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
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- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 18 de novembro de 2010 10:57
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 19 de novembro de 2010 10:37
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- Sugerido como Resposta AndreAlvesLimaModerator quinta-feira, 18 de novembro de 2010 10:57
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 19 de novembro de 2010 10:37
-
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 -
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
-
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