我正在寻找一种覆盖HttpWebResponse类的GetResponseStream方法的方法,以便返回自定义流。基本上我的目标是修改流。不确定这是否可行?这是在与Web服务集成的上下文中完成的,我需要从响应流中去掉一些内容。有什么想法吗?
答案 0 :(得分:1)
我正在寻找一种覆盖GetResponseStream方法的方法 HttpWebResponse类,以便返回自定义流。
冷却。 GetResponseStream
无论如何都是虚拟的,所以继续,覆盖它并返回你想要的任何东西。当然,您必须以这样的方式设计代码,这样您就不会使用HttpWebResponse类的具体实现,这种情况很少发生。因为你经常从HttpWebRequest获得一个HttpWebResponse实例。这就是紧密耦合。因此,开始考虑如何在代码中抽象整个HTTP内容。我的意思是停止考虑HttpWebRequests。开始考虑代码中的接口和抽象。无论如何,这就是拯救你的东西,这会削弱代码不同层之间的耦合,使其可以单元测试。
这个答案的要点是你的代码应该以这样的方式设计,以便它不依赖于任何HttpWebRequest具体类。你应该开始考虑将它隐藏在一个界面抽象的背后,你可以在单元测试中轻松模拟它。
一旦您在界面后面抽象Web服务调用,您就可以非常轻松地在单元测试中模拟此调用,以测试系统的实际行为,而无需依赖测试中的特定类。
答案 1 :(得分:0)
您无法轻易覆盖HttpWebResponse
的行为。您可以在客户端包装Web服务API,如@Jon在评论中建议的那样,或者,如果您真的想要冒险,请更改请求,将其指向将要使用的代理服务器根据需要修改流。
答案 2 :(得分:0)
假设您可以修改调用GetResponseStream的代码,那么适配器模式可能不是一个糟糕的选择。
class MyCustomStream:Stream { 流originalStream;
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();
// with ....
var myStream = new MyCustomStream(request.GetResponseStream());