我有一个奇怪的问题,尝试使用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一样。< / p>
另一个原因是我只是想知道为什么这会讨厌单桅帆船来解决这些问题,有人可以帮助我吗?
答案 0 :(得分:1)
Stream.Read()
可能不会给你整个缓冲区,允许返回更少。如果要读取整个流,则必须在循环中调用它,直到它返回0.
答案 1 :(得分:0)
好的,找到解决方案,但不是问题来源,只是在循环中使用ReadByte
,不知道为什么Read
有问题,使用反射器我能够发现它可能是问题SslStream
内部缓冲,但谁知道。