Странный tcpclient https пост-ответ - PullRequest
0 голосов
/ 27 августа 2011

У меня странная проблема при попытке получить полный ответ с веб-страницы, используя TcpClient, на которую я отправляю POST. Вот код:

byte[] RecvBufferxxxx = new byte[4096];

var returnData = "";
var uri = new Uri(string.Format(core.serverAuth, "app_data"));
var head = new WebHeaderCollection();
head[HttpRequestHeader.Host] = uri.Host;
head[HttpRequestHeader.Connection] = "keep-alive";
head[HttpRequestHeader.AcceptEncoding] = "deflate";

using (var client = new TcpClient(uri.Host, 443))
{
    client.SendTimeout = 10000;
    client.ReceiveTimeout = 10000;
    using (SslStream s = new SslStream(client.GetStream(), false, 
        IgnoreCertificateErrorHandler, null))
    {
        s.AuthenticateAsClient(uri.Host, null, SslProtocols.Tls, false);

        var hhd = "POST " + uri.PathAndQuery + " HTTP/1.0\r\n" + head;

        var bts = Encoding.ASCII.GetBytes(hhd);
        s.Write(bts, 0, bts.Length);
        s.Flush();
        s.ReadByte();

        var n = s.Read(RecvBufferxxxx, 0, RecvBufferxxxx.Length);
        // var tmp = Encoding.ASCII.GetString(RecvBufferxxxx, 0, n);
        // ANOTHER CALL SAMPLE   
        // n = s.Read(RecvBufferxxxx, 0, RecvBufferxxxx.Length);

        using (MemoryStream ms = new MemoryStream(RecvBufferxxxx, 0, n))
        {
            ms.ReadByte();
            ms.ReadByte();
            using (DeflateStream df = new DeflateStream(ms, 
                CompressionMode.Decompress))
            {
                using (StreamReader rd = new StreamReader(df))
                {
                    returnData = rd.ReadToEnd();
                }
            }
        }
    }
}

Этот код работает, но он получает только заголовки ответа, мне нужно сделать еще один вызов, чтобы получить тело ответа, и я не знаю почему.

Ответ от моего сервера и очень короткий.

Раньше я использовал только Socket, и он получал все за один вызов, но теперь я переписал его, как в коде, добавляющем SSL и deflate.

Я проверил ту же ссылку в Firefox с Firebug, и был только один ответ get и полный ответ.

Я дважды проверил его с помощью wireshark и firebug, используя firebug, и этот список кодов wireshark выглядит совершенно одинаково.

Я могу выполнить второе чтение с помощью этого кода, а затем получить тело ответа, но затем я вижу в wireshark, что было установлено еще одно соединение ssl, и я не хочу этого, я хочу, как Firefox делает это.

Другая причина в том, что я просто хочу знать, почему это происходит, и я могу помочь?

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Stream.Read() может не дать вам весь буфер, разрешено возвращать меньше. Если вы хотите прочитать весь поток, вы должны вызывать его в цикле, пока он не вернет 0.

0 голосов
/ 28 августа 2011

Хорошо, найдено решение, но не источник проблемы, просто используйте ReadByte в цикле, не знаю, почему Read имеет проблемы, используя отражатель, я смог обнаружить, что это может быть проблема с SslStream внутренняя буферизация, но кто знает.

...