Правильный способ чтения из HttpWebResponse и .NET 4.0 Framework - PullRequest
3 голосов
/ 10 декабря 2010

В настоящее время у нас возникла проблема с чтением ResponseStream, с которым у нас не было проблем в прошлом. С момента добавления .NET 4.0 Framwework на наш сервер вчера вечером и назначения IIS для использования новой инфраструктуры мы испытываем несколько разных исключений при попытке прочитать responseStream с помощью следующего оператора (responseStream = httpResponse.GetResponseStream ();). Все до этого момента работает совершенно нормально. Итак, я ищу изменения / улучшения, как читать из ответа. Я вставил приведенный ниже код, который мы используем, и исключения, с которыми мы сталкиваемся.

Наше окружение:

.NET Framework 4.0 Windows Server 2003

КОД:

        HttpWebResponse httpResponse;
        Stream responseStream;
        //Accept All Certificate Policy 
        ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

        HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(new Uri(theUrl));
        httpRequest.Method = "POST";
        httpRequest.KeepAlive = false;
        httpRequest.Timeout = timeOut;


        try
        {
            httpResponse = (HttpWebResponse)httpRequest.GetResponse();
            responseStream = httpResponse.GetResponseStream();
        }

ИСКЛЮЧЕНИЯ:

'httpResponse.GetResponseStream (). Length' вызвала исключение типа 'System.NotSupportedException' long {System.NotSupportedException}

'httpResponse.GetResponseStream (). Позиция' вызвала исключение типа 'System.NotSupportedException' long {System.NotSupportedException}

{"Этот поток не поддерживает операции поиска."} System.SystemException {System.NotSupportedException}


С уважением,

Mike

1 Ответ

6 голосов
/ 10 декабря 2010

Вы не показали бит кода, который пытается использовать длину - но в основном вам не гарантируется, что вы будете знать длину потока.Сервер, возможно, не дал заголовок длины содержимого.

Если вам нужно возиться с потоком, вероятно, лучше просто скопировать все данные в MemoryStream.С .NET 4 это действительно просто:

MemoryStream ms = new MemoryStream();
responseStream.CopyTo(ms);

Если вам не нужна длина для чего-либо (например, вы просто хотите загрузить результаты в виде XML-документа), просто читайте из потока безвызов Length.

Обратите внимание, что, как правило, рекомендуется объявлять переменные в точке инициализации, если это возможно, и вы должны использовать операторы using для веб-ответа и потока ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...