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



我正在寻找一种方法来覆盖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(((;

相关内容

  • 没有找到相关文章

最新更新