System.Net.HttpWebResponse返回System.IO.Stream.NullStream

时间:2011-08-05 15:39:57

标签: c# .net httpwebresponse

我遇到HttpWebResponse.GetResponseStream()返回System.Net.NullStream的情况,即使对HttpWebResponse对象的检查显示其基础m_ConnectStreamSystem.Net.ConnectStream的实例并且ContentLength属性与服务器返回的内容的长度完全匹配。我也在Watch窗口中探索并找到了我的数据,但是不记得我找到了它的位置,但我知道我的响应数据在那里,运行时只是不让我这么做!

唯一与其他成功案例不同的是HttpWebRequest动词是“HEAD”。我正在实现一个高度RESTful的Web服务,并希望使用“HEAD”来请求资源的元数据。

1 个答案:

答案 0 :(得分:2)

想出来:

找到以下.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相同,只是服务器不能在响应中返回消息体。响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同。该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身。此方法通常用于测试超文本链接的有效性,可访问性和最近的修改。

哇。我从Richardson和Ruby RESTful Web Services一书中获取了您可能很聪明的内容,并使用空白的XHTML表单响应“HEAD”请求,该表单将完整地描述资源元素的结构,包括所需的,必需性,数据类型,长度等。 XHTML(5)表单字段属性。但是,在阅读HTTP规范之后,很明显所有“HEAD”响应数据都必须放在HTTP头中。

哦,你每天都学到新东西......