0

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

4

3 回答 3

1

我正在寻找一种方法来覆盖 HttpWebResponse 类的 GetResponseStream 方法,以便返回自定义流。

凉爽的。无论如何都是虚拟的GetResponseStream,所以继续,覆盖它并返回你想要的任何东西。当然,您必须以这样的方式设计您的代码,这样您就不会使用很少出现的 HttpWebResponse 类的具体实现。因为您通常会从 HttpWebRequest 获得 HttpWebResponse 实例。这就是紧耦合。因此,开始思考如何在代码中抽象出整个 HTTP 内容。我的意思是停止思考 HttpWebRequests。开始考虑代码中的接口和抽象。无论如何,这将拯救您,这将削弱代码不同层之间的耦合并使其可单元测试。

这个答案的重点是,您的代码应该以不依赖于任何 HttpWebRequest 具体类的方式设计。您应该开始考虑将其隐藏在可以在单元测试中轻松模拟的接口抽象后面。

一旦您将 Web 服务调用抽象到接口后面,您就可以在单元测试中轻松地模拟此调用以测试系统的实际行为,而无需依赖测试中的特定类。

于 2013-09-24T21:28:12.927 回答
0

您不能轻易覆盖HttpWebResponse的行为。正如@Jon 在评论中建议的那样,您可以在客户端包装 Web 服务 API,或者,如果您真的想冒险,请更改request,将其指向将根据需要修改流的代理服务器。

不过,这不会是微不足道的。

于 2013-09-24T21:31:44.520 回答
0

假设您可以修改调用 GetResponseStream 的代码,适配器模式可能不是一个糟糕的选择。

类 MyCustomStream : 流 { 流 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();

// 和....

var myStream = new MyCustomStream(request.GetResponseStream());

于 2013-09-24T21:35:50.377 回答