C # NetworkStream.Читать странность

Кто-нибудь может указать на недостаток в этом коде? Я получаю некоторый HTML с TcpClient. Кажется, что NetworkStream.Read () никогда не завершается при обращении к серверу IIS. Если я вместо этого использую прокси-сервер Fiddler, он работает нормально, но при непосредственном обращении к целевому серверу цикл .read () не завершится, пока не произойдет исключение соединения с ошибкой типа «удаленный сервер закрыл соединение».

internal TcpClient Client { get; set; }

/// bunch of other code here...

try
{

NetworkStream ns = Client.GetStream();
StreamWriter sw = new StreamWriter(ns);

sw.Write(request);
sw.Flush();

byte[] buffer = new byte[1024];

int read=0;

try
{
    while ((read = ns.Read(buffer, 0, buffer.Length)) > 0)
    {
        response.AppendFormat("{0}", Encoding.ASCII.GetString(buffer, 0, read));
    }
}
catch //(SocketException se)
{

}
finally
{
    Close();
}

Обновить

В отладчикеЯ вижу весь ответ немедленно и добавляется к моему StringBuilder (ответ). Просто кажется, что соединение не закрывается, когда сервер завершил отправку ответа, или мой код не обнаруживает его.

Заключение Как уже было сказано, лучше всего воспользоваться преимуществами протокола (в случае HTTP, заголовка Content-Length), чтобы определить, когда транзакция завершена. Однако я обнаружил, что не на всех страницах задана длина контента. Итак, я сейчас использую гибридное решение:

Для ВСЕХ транзакций установите запросConnection заголовок, чтобы "закрыть", так что сервер не рекомендуется держать сокет открытым. Это повышает вероятность того, что сервер закроет соединение, когда оно ответит на ваш запрос.

ЕслиContent-Length установлен, используйте его, чтобы определить, когда запрос завершен.

Иначе, установите для свойства NetworkStream RequestTimeout большое, но разумное значение, например, 1 секунду. Затем включитеNetworkStream.Read() пока либо а) не истечет время ожидания, либо б) вы не прочитали меньше байтов, чем просили.

Спасибо всем за отличные и подробные ответы.

Ответы на вопрос(5)

Ваш ответ на вопрос