奇怪的tcpclient https post响应

本文关键字:post 响应 https tcpclient | 更新日期: 2023-09-27 18:07:01

我有一个奇怪的问题,试图从使用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。

我用firebug检查了firefox中相同的链接,只有一个get和完整的响应。

我用wireshark和firebug仔细检查了一下,使用firebug和wireshark清单上的代码看起来完全一样。

我可以用这段代码进行第二次读取,然后我得到响应体,但随后我在wireshark中看到有另一个ssl连接,我不想要这个,我想要的就像firefox一样。

另一个原因是我只是想知道为什么会发生这种情况以及如何解决这些问题,有人能帮助我吗?

奇怪的tcpclient https post响应

Stream.Read()可能不会给你整个缓冲区,它被允许返回更少。如果你想读取整个流,你必须在循环中调用它,直到它返回0。

好的,找到了解决方案,但不是问题的起源,只是使用ReadByte在循环中,不知道为什么Read有问题,使用反射器我能够发现它可能是SslStream内部缓冲的问题,但谁知道。