2010-10-27 18 views
4

对初始HttpWebResponse.GetResponseStream()进行调用并读取流后,该流已完成并且无法重用。有没有一种方法可以检查WebResponse而不影响.NET中的基础响应流?

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

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

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

回答

4

如何:

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

如果你不希望加载整个反应到内存中,你可以把它传递给一些分析功能,将再次对其进行检查并返回一个包含所有属性将某个对象对你感兴趣后,你可以尽可能多地检查这个对象。

+0

+1推荐WebClient。太多的人使用WebRequest和WebResponse,因为他们不知道WebClient,它会在单个语句中获取和发布请求。 – Chris 2010-10-27 16:53:18

+0

我同意人们应该更多地使用WebClient。但就我而言,我无法使用WebClient,因为我需要自己构建请求。 WebClient适用于简单的事情,但不适合复杂的请求。而且请求很复杂,在客户端处理这个问题不仅麻烦 - 即重新创建另一个请求。我所追求的是尽可能对客户端代码透明。 – 2010-10-27 20:45:54

+0

加不会这种方法要求你做两个不同的调用?检查后再将字符串转换回流可能会更好。 – BigOmega 2012-09-14 16:09:29

2

您是否尝试过设置位置的流回?

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

+0

WebRequest和WebResponse返回的流是不可搜索的 - 你不能倒带它。那是我尝试的第一件事,相信我。 – 2010-10-27 20:42:24

+0

@Jijho Han - 我想我是用HttpContext.Request完成的。对不起,它没有工作... – 2010-10-27 23:25:00

1

看起来这可能是message inspector的正确位置。您会覆盖AfterReceiveRequest以查找您的相关“特定数据”。如果没有“某些数据”,则将该副本放回到邮件正文中,然后离开,否则您可能想要引发事件或抛出代码可能捕获的异常,然后“去获取其他页面”。

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

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

+0

啊...看起来像是一个WCF功能。不幸的是,我们仍然在2.0这里。 – 2010-10-28 17:41:57

相关问题