在调用初始HttpWebResponse.GetResponseStream()并读取流后,该流已完成且无法重复使用。
我有一种情况需要检查响应的内容,如果是某个数据,请获取另一个页面,然后将新响应传递给该行。否则,按原样传递原始响应。唯一的问题是,在检查了检查这个“特殊数据”的响应后,该响应对下游代码没有好处。
我能想到的唯一方法是使下游代码透明,就是创建HttpWebResponse的派生类,并以某种方式缓存流式传输的数据,并将该缓存的流传递给行而不是初始流。我不确定这是否可行,因为我没有进一步调查。
有没有其他方法可以处理这样的情景?
答案 0 :(得分:4)
这个怎么样:
using (var client = new WebClient())
{
string result = client.DownloadString("http://www.foo.bar");
// TODO: examine result as much as you wish
}
如果你不想将整个响应加载到内存中,你可以将它传递给一些解析函数,该函数将检查它一次并返回一个包含你感兴趣的所有属性的对象,以便在你将这个对象检查为你愿意的。
答案 1 :(得分:2)
您是否尝试将流的位置设置回 0 ?
处理完流后,光标位于流的末尾。这就是为什么当ASP.NET开始处理流时,没有什么可读的。尝试将光标移动到流的开头 - 然后ASP.NET可以读取整个请求。
答案 2 :(得分:1)
这看起来可能是message inspector的正确位置。您将覆盖AfterReceiveRequest
以查找相关的“特定数据”。如果没有“某些数据”,那么将副本放回到消息体中并消失,否则您可能想要引发一个事件或抛出一个代码会捕获的异常,然后“去获取其他页面”。
使用消息检查器,您可以查看传入/传出数据,根据需要进行修改,或将其不加改变地传递到原始目标。
注意:对于邮件检查器和自定义行为,您需要.NET 3.0或更高版本。