|
1
|
| Roman Pokrovskij Archil Labadze · 技术社区 · 15 年前 |
|
1
0
我可以说这是不可能的。我想说明原因: 非常深层的内部代码(System.ServiceModel.Channels.HttpChannelFactory+HttpRequestChannel+HttpChannelRequest类,WaitForReply方法)-您永远不想进行继承,而Reflection将重点放在这些内部类上-包含两行 var响应=(HttpWebResponse)此。webRequest。GetResponse();//webRequest是HttpWebRequest的类型 HttpInput输入=HttpChannelUtilities。ValidateRequestReplyResponse(this.webRequest,response,this.factory,responseException); 由于HttpWebRequest是公共的,而GetResponse是虚拟的,所以似乎可以通过这种方式覆盖它
然后我们需要在某处使用反射来创建FakedHttpWebRequest,而不是HttpWebRequest。。。 不幸的是,这次“某处”似乎是静态的(!)方法(WebRequest.Create),所以没有机会停留在“小黑客”范围内。 |
|
2
0
我觉得我发现了这个计划是如何被破解的。 从继承新类 系统服务模型。频道。HttpChannelFactory+HttpRequestChannel+HttpChannelRequest 并重写WaitForReply虚拟方法 从继承新类 系统服务模型。频道。HttpChannelFactory+HttpRequestChannel 并重写CreateRequest(Message)接口方法 继承新的班级形式 系统服务模型。频道。HttpChannelFactory 并重写OnCreateChannel(EndpointAddressRemoteAddress,Uri via)方法 问题:所有这些类都是私有的和内部的(!)。解决方案是,使用反射/发射/类型生成器/codedom在运行时创建它们。所有提到的方法都很短(只有WaitForReply是详细的),所有方法都是虚拟的——在这里我们真的很幸运。 然后从Http(s)TransportBindingElement继承 并重写BuildChannelFactory(BindingContext上下文); 然后创建自定义绑定 :) P、 我不确定是否可以从内部受保护的类或其他程序集继承它来创建新类型,但我猜这是可能的。 |