寻找一种方法来覆盖HttpWebResponse的GetResponseStream方法

时间:2013-09-24 21:24:10

标签: c# .net web-services stream httpwebresponse

我正在寻找一种覆盖HttpWebResponse类的GetResponseStream方法的方法,以便返回自定义流。基本上我的目标是修改流。不确定这是否可行?这是在与Web服务集成的上下文中完成的,我需要从响应流中去掉一些内容。有什么想法吗?

3 个答案:

答案 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());