none
TcpClient, NetworkStream e flag FIN

    Pergunta

  • Olá,

    Estou desenvolvendo um Windows Service que roda um TcpListener e espera conexões de um TcpClient de um Web Service.

    Estou utilizando um NetworkStream para transferir os dados para o TcpClient.

    O WebService abre uma conexão com o WinService, envia um pedido, o WinService faz uma requisição de venda ao parceiro do projeto, recebe a resposta do parceiro, formata, e devolve o texto ao WebService.

    Minha dúvida/problema acontece quando o WebService desconecta do WinService, por causa de um timer que indica o timeout do WebService, mas não envia um pacote TCP com um flag FIN o WinService. Assim, quando o WinSerivce tenta responder, ele tenta enviar o texto de retorno o WebService mas não ocorre nenhuma excessão, então não posso decidir o que fazer com a venda: confirmar ou desfazer.

    Isso também será um problema se o WebService fosse fechar ou sofrer uma Unhandled Exception e não enviar um pacote TCP com FIN ao WinService.

    Existe alguam maneira de o WebService enviar um FIN ao WinService quando realizar a desconexão? Existe alguma maneira de o WinService checar, antes de enviar o texto de retorno ou periodicamente , se a conexão TPC está viva?

    Grato pela atenção.
    terça-feira, 10 de outubro de 2006 19:35

Respostas

  • José,

        Entendo o que você deseja fazer. E mesmo que conseguisse, de alguma forma, garantir que fosse transmitido um pacote FIN, o fato é que você simplesmente não pode confiar nisso. Podem ocorrer problemas de hardware - quebra de um cabo, por exemplo - que impediriam o sinal de chegar ao WinService mesmo que ele tivesse sido gerado pelo WebService.

        A solução ideal para o que você deseja fazer é comumemente conhecida por "mensageria" (messaging). A tradução em português é horrível, mas o princípio é excelente: um sistema autônomo para troca assíncrona e confiável de mensagens. O Microsoft Message Queue (MSMQ) foi feito exatamente com essa finalidade.

        De forma simplificada, a idéia é: o web service manda uma mensagem via MSMQ ao windows service de forma assíncrona.E não se preocupa se a mensagem foi entregue ou se já foi respondida. Apenas aguarda pelo tempo pré-determinado (digamos, dez minutos).

        A fila do MSMQ no servidor do web service, por sua vez, trata de despachar a mensagem a um servidor central, ou diretamente ao servidor do windows service, garantindo a integridade dessa mensagem. Se não for possível entregá-la por algum motivo o web service será avisado.

        Depois disso, o windows service recebe a mensagem, executa as transações necessárias, e responde ao web service também via MSMQ - que se vira para entregar a resposta.

        Parece complicado, mas não é. O MSMQ é um componente padrão do Windows 2003 e o .NET Framework tem suporte nativo ao MSMQ (namespace System.Messaging).

        Veja mais detalhes em http://msdn.microsoft.com/msdnmag/issues/03/12/MSMQandNET/

     

    quarta-feira, 11 de outubro de 2006 02:29

Todas as Respostas

  • José,

        Entendo o que você deseja fazer. E mesmo que conseguisse, de alguma forma, garantir que fosse transmitido um pacote FIN, o fato é que você simplesmente não pode confiar nisso. Podem ocorrer problemas de hardware - quebra de um cabo, por exemplo - que impediriam o sinal de chegar ao WinService mesmo que ele tivesse sido gerado pelo WebService.

        A solução ideal para o que você deseja fazer é comumemente conhecida por "mensageria" (messaging). A tradução em português é horrível, mas o princípio é excelente: um sistema autônomo para troca assíncrona e confiável de mensagens. O Microsoft Message Queue (MSMQ) foi feito exatamente com essa finalidade.

        De forma simplificada, a idéia é: o web service manda uma mensagem via MSMQ ao windows service de forma assíncrona.E não se preocupa se a mensagem foi entregue ou se já foi respondida. Apenas aguarda pelo tempo pré-determinado (digamos, dez minutos).

        A fila do MSMQ no servidor do web service, por sua vez, trata de despachar a mensagem a um servidor central, ou diretamente ao servidor do windows service, garantindo a integridade dessa mensagem. Se não for possível entregá-la por algum motivo o web service será avisado.

        Depois disso, o windows service recebe a mensagem, executa as transações necessárias, e responde ao web service também via MSMQ - que se vira para entregar a resposta.

        Parece complicado, mas não é. O MSMQ é um componente padrão do Windows 2003 e o .NET Framework tem suporte nativo ao MSMQ (namespace System.Messaging).

        Veja mais detalhes em http://msdn.microsoft.com/msdnmag/issues/03/12/MSMQandNET/

     

    quarta-feira, 11 de outubro de 2006 02:29
  • Obrigado Igor, estudarei o MSMQ imediatamente!
    quinta-feira, 12 de outubro de 2006 20:39