TcpClient.GetStream (). DataAvailable retorna false, mas o fluxo tem mais dados

Portanto, parece que um Read () de bloqueio pode retornar antes de terminar de receber todos os dados que estão sendo enviados para ele. Por sua vez, envolvemos o Read () com um loop que é controlado pelo valor DataAvailable do fluxo em questão. O problema é que você pode receber mais dados nesse loop while, mas não há processamento nos bastidores para que o sistema saiba disso. A maioria das soluções que encontrei na Internet não se aplica de uma maneira ou de outra a mim.

O que acabei fazendo é que, como último passo no meu loop, faço um Thread.Sleep simples (1) depois de ler cada bloco do fluxo. Isso parece dar tempo ao sistema para atualizar e não estou obtendo resultados precisos, mas isso parece um pouco invasivo e um tanto "circunstancial" para uma solução.

Aqui está uma lista das circunstâncias com as quais estou lidando: Conexão TCP única entre um aplicativo IIS e um aplicativo autônomo, ambos escritos em C # para comunicação de envio / recebimento. Ele envia uma solicitação e aguarda uma resposta. Essa solicitação é iniciada por uma solicitação HTTP, mas não estou tendo esse problema ao ler dados da Solicitação HTTP, é após o fato.

Aqui está o código básico para lidar com uma conexão de entrada

protected void OnClientCommunication(TcpClient oClient)
{
    NetworkStream stream = oClient.GetStream();
    MemoryStream msIn = new MemoryStream();

    byte[] aMessage = new byte[4096];
    int iBytesRead = 0;

    while ( stream.DataAvailable )
    {
        int iRead = stream.Read(aMessage, 0, aMessage.Length);
        iBytesRead += iRead;
        msIn.Write(aMessage, 0, iRead);
        Thread.Sleep(1);
    }
    MemoryStream msOut = new MemoryStream();

    // .. Do some processing adding data to the msOut stream

    msOut.WriteTo(stream);
    stream.Flush();

    oClient.Close();
}

Todos os comentários são bem-vindos para uma solução melhor ou apenas um sinal de positivo para a necessidade de suspensão do sono (1) para permitir que as coisas sejam atualizadas corretamente antes de verificarmos o valor DataAvailable.

Acho que, depois de 2 anos, espero que a resposta paraessa questão não é assim que as coisas ainda são :)

questionAnswers(4)

yourAnswerToTheQuestion