У меня странная проблема с попыткой получить полный ответ с веб-страницы, используя 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 и дефляцию.
Я проверил ту же ссылку в firefox с помощью firebug, и есть только один полный ответ.
Я дважды проверил это с помощью wireshark и firebug, используя firebug, и этот код wireshark выглядит совершенно одинаково.
Я могу сделать второе чтение с этим кодом, а затем получить тело ответа, но затем я вижу в wirehark, что было установлено другое ssl-соединение, и я не хочу этого, я хочу так же, как это делает firefox.
Другая причина в том, что я просто хочу знать, почему это происходит, и как это исправить, может ли кто-нибудь мне помочь?
WebClientкласс? Или, если вам требуется более подробный контроль над запросом,HttpWebRequest< /а> класс? Оба обрабатывают дефляцию сжатых потоков, SSL и POST-запросов. - person casperOne   schedule 27.08.2011homework. - person casperOne   schedule 28.08.2011