System.Net.HttpWebResponse Возвращение System.IO.Stream.NullStream - PullRequest
4 голосов
/ 05 августа 2011

У меня есть случай, когда HttpWebResponse.GetResponseStream() возвращает System.Net.NullStream, хотя проверка объекта HttpWebResponse показывает, что его базовый m_ConnectStream является экземпляром System.Net.ConnectStream, а свойство ContentLength точно соответствует длине содержимого, возвращенного с сервера. Я также ковырялся в окне Watch и нашел свои данные, но не могу вспомнить, где я их нашел, но я ЗНАЮ, что мои данные ответа есть, время выполнения просто не позволит мне это сделать!

Единственное, что отличается от других успешных сценариев, это то, что глагол HttpWebRequest это "ГОЛОВА". Я реализую веб-сервис с высокой степенью RESTful и хочу использовать «HEAD» для запроса метаданных ресурсов.

1 Ответ

2 голосов
/ 08 августа 2011

Понял:

Найден следующий исходный код .Net Fx (в классе HttpWebResponse):

/// <devdoc> 
/// <para>Gets the stream used for reading the body of the response from the 
/// server.</para> 
/// </devdoc> 
public override Stream GetResponseStream() 
{ 
    if (Logging.On) 
        Logging.Enter(Logging.Web, this, "GetResponseStream", ""); 
    CheckDisposed(); 

    if (!CanGetResponseStream()) { 
        // give a blank stream in the HEAD case, which = 0 bytes of data 
        if (Logging.On) 
            Logging.Exit(Logging.Web, this, "GetResponseStream", 
                Stream.Null); 
        return Stream.Null; 
    } 
    if (Logging.On) 
        Logging.PrintInfo(Logging.Web, 
            "ContentLength=" + m_ContentLength); 
    if (Logging.On) 
        Logging.Exit(Logging.Web, this, "GetResponseStream", 
            m_ConnectStream); 
    return m_ConnectStream; 
} 

Как вы можете видеть, он явно возвращает нулевой поток для "HEAD"Запросы."Зачем это делать?"Я спрашиваю.

Я нашел это в http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html:

9.4 HEAD

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения вответ.Метаинформация, содержащаяся в заголовках HTTP в ответ на запрос HEAD, ДОЛЖНА быть идентична информации, отправленной в ответ на запрос GET.Этот метод может использоваться для получения метаинформации о сущности, подразумеваемой запросом, без передачи самого тела сущности.Этот метод часто используется для тестирования гипертекстовых ссылок на валидность, доступность и последние изменения.

Вау.Я взял из книги Richardson и Ruby RESTful Web Services, что вы можете быть умным и ответить на запрос «HEAD» с пустой формой XHTML, которая бы полностью описывала структуру элементов ресурса, включая обязательность, тип данных, длину и т. Д., Используя всеатрибуты поля формы XHTML (5).Однако после прочтения спецификации HTTP становится ясно, что все данные ответов 'HEAD' должны идти в заголовках HTTP.

Ну да, каждый день вы узнаете что-то новое ...

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