我正在寻找一种方法来覆盖HttpWebResponse类的GetResponseStream方法,以便返回自定义流。本质上,我的目标是修改流。不确定这是否可能?这是在与 Web 服务集成的上下文中完成的,我需要从响应流中删除一些内容。有什么想法吗?
我正在寻找一种方法来覆盖 GetResponseStream 方法 HttpWebResponse 类,以便返回自定义流。
凉。无论如何,GetResponseStream
都是虚拟的,所以继续,覆盖它并返回您想要的任何内容。当然,您必须以这样的方式设计代码,以便您不会使用 HttpWebResponse 类的具体实现,这种情况很少见。通常,您从HttpWebRequest获得HttpWebResponse实例。这就是紧密耦合。因此,开始考虑如何在代码中抽象整个HTTP内容。我的意思是停止思考HttpWebRequests。开始考虑代码中的接口和抽象。无论如何,这都会拯救你,这就是削弱代码不同层之间的耦合并使其可进行单元测试的原因。
这个答案的要点是,你的代码应该以这样的方式设计,以便它不依赖于任何HttpWebRequest具体类。你应该开始考虑把它隐藏在一个接口抽象后面,你可以在单元测试中轻松模拟。
一旦将 Web 服务调用抽象到接口后面,您就可以非常轻松地在单元测试中模拟此调用,以测试系统的实际行为,而无需依赖测试中的特定类。
你不能轻易地覆盖HttpWebResponse
的行为。要么按照注释中的建议,将 Web 服务 API 包装在客户端@Jon,要么,如果您真的想冒险,请更改请求,将其指向将根据需要修改流的代理服务器。
不过,这不会是微不足道的。
假设您可以修改调用 GetResponseStream 的代码,适配器模式可能不是一个糟糕的选择。
类 MyCustomStream : Stream{ 流原始流;
MyCustomStream(Stream originalStream)
{ this.originalStream = originalStream; }
override int Read(byte [] buffer, int offset, int count)
{
byte [] temp = new byte[count];
var ret = originalStream.Read(temp, offset, count);
// modify your buffer if desired
Array.Copy(buffer, temp);
return ret;
}
// implement all the other abstract methods of Stream and just call originalStream
}
现在像这样替换代码....
var myStream = request。GetResponseStream((;
//跟。。。。
var myStream = new MyCustomStream(request.GetResponseStream(((;