我有一个HttpWebResponse.GetResponseStream()返回System.Net.NullStream的情况,即使检查HttpWebResponse对象显示其底层m_ConnectStream是System.Net.ConnectStream的实例,ContentLength属性完全匹配内容的长度从服务器返回.我也在Watch窗口中探索并找到了我的数据,但不记得我找到了它的位置,但我知道我的响应数据在那里,运行时只是不让我这么做!
唯一不同于其他成功场景的是HttpWebRequest动词是“HEAD”.我正在实现一个高度RESTful的Web服务,并希望使用“HEAD”来请求资源的元数据.
解决方法
弄清楚了:
找到以下.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,Stream.Null); return Stream.Null; } if (Logging.On) Logging.PrintInfo(Logging.Web,"ContentLength=" + m_ContentLength); if (Logging.On) Logging.Exit(Logging.Web,m_ConnectStream); return m_ConnectStream; }
如您所见,它显式返回“HEAD”请求的空流. “为什么会这样呢?”我问.
我在http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html发现了这个:
9.4头
HEAD方法与GET相同,只是服务器不能在响应中返回消息体.响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同.该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身.此方法通常用于测试超文本链接的有效性,可访问性和最近的修改.
哇.我从Richardson和Ruby RESTful Web Services一书中获取了您可能很聪明的内容,并使用空白的XHTML表单响应“HEAD”请求,该表单将完整地描述资源元素的结构,包括所需的,必需性,数据类型,长度等. XHTML(5)表单字段属性.但是,在阅读HTTP规范之后,很明显所有“HEAD”响应数据都必须放在HTTP标头中.
哦,你每天都学到新东西……
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。