有没有一种方法可以在不影响.NET中底层响应流的情况下检查WebResponse?

有没有一种方法可以在不影响.NET中底层响应流的情况下检查WebResponse?,.net,asp.net,httpwebresponse,.net,Asp.net,Httpwebresponse,调用初始HttpWebResponse.GetResponseStream()并读取流后,该流已完成,无法重用 在这种情况下,我需要检查响应的内容,如果是某个数据,则获取另一个页面,然后将新的响应向下传递。否则,按原样传递原始响应。唯一的问题是,在检查响应以检查此“特殊数据”之后,该响应对下游代码没有好处 我能想到的唯一方法是,创建HttpWebResponse的派生类,以某种方式缓存数据流,并将缓存的流而不是初始流传递给下游代码。我不确定这是否可行,因为我还没有进一步研究 有没有其他方法可以处

调用初始HttpWebResponse.GetResponseStream()并读取流后,该流已完成,无法重用

在这种情况下,我需要检查响应的内容,如果是某个数据,则获取另一个页面,然后将新的响应向下传递。否则,按原样传递原始响应。唯一的问题是,在检查响应以检查此“特殊数据”之后,该响应对下游代码没有好处

我能想到的唯一方法是,创建HttpWebResponse的派生类,以某种方式缓存数据流,并将缓存的流而不是初始流传递给下游代码。我不确定这是否可行,因为我还没有进一步研究

有没有其他方法可以处理这样的情况?

这样如何:

using (var client = new WebClient())
{
    string result = client.DownloadString("http://www.foo.bar");
    // TODO: examine result as much as you wish
}

如果您不想将整个响应加载到内存中,您可以将其传递给某个解析函数,该函数将对其进行一次检查,并返回一个包含您感兴趣的所有属性的对象,以便在您检查完该对象后,您可以随心所欲地检查该对象。

您是否尝试将流的位置设置回0


处理完流后,光标位于流的末尾。这就是为什么当ASP.NET开始处理流时,没有什么可读取的内容。尝试将光标移动到流的开头,这样ASP.NET就可以读取整个请求。

这看起来可能是一个正确的位置。您需要覆盖AfterReceiveRequest的
以查找相关的“特定数据”。如果没有“特定数据”,则将副本放回消息正文并离开,否则您可能希望引发一个事件或抛出一个代码将捕获的异常,然后“转到另一页”

使用消息检查器,您可以查看传入/传出数据,如果需要,可以对其进行修改,或者将其原封不动地传递到原始目标


注意:对于消息检查器和自定义行为,您需要.NET3.0或更高版本

+1用于推荐网络客户。太多的人使用WebRequest和WebResponse,因为他们不知道WebClient,这将在一个语句中完成get和post请求。我同意人们应该更多地使用WebClient。但在我的情况下,我不能使用WebClient,因为我需要自己构建请求。WebClient适用于简单的事情,但不适用于复杂的请求。由于请求很复杂,在客户端处理它不仅很麻烦,也就是重新创建另一个请求。我追求的是尽可能对客户端代码透明。另外,这个方法不需要您进行两个不同的调用吗?检查完字符串后,最好将其转换回流。@libertas,如果您想直接使用响应流,没有任何东西可以阻止您使用
WebClient.OpenRead
方法。WebClient类具有足够的通用性,提供了执行HTTP请求所需的所有功能。WebRequest和WebResponse返回的流是不可查找的-您不能倒带它。那是我第一次尝试,相信我。啊。。。看起来这是一个WCF功能。不幸的是,我们仍然使用2.0。