.net 真实代理和透明代理的交互

  1 1.本地代理调用
  2
  3
  4 using System;
  5 using System.Runtime.Remoting ;
  6 using System.Runtime.Remoting.Services ;
  7 using System.Runtime.Remoting.Activation ;
  8 using System.Runtime.Remoting.Proxies ;
  9 using System.Runtime.Remoting.Messaging ;
 10
 11
 12 /*
 13   本程序说明了截获是如何进行的,以及真实代理和透明代理之间的关系及交互。
 14 */
 15 namespace Intercept_example
 16 {
 17     class Class1
 18     {
 19         private static string[] gg={"sdf", "fsddx"};
 20         [STAThread]
 21         static void Main(string[] args)
 22         {
 23             Example exa = new Example("sky" ) ;
 24             exa.say_hello() ;
 25         }
 26     }
 27
 28     //定义一个真实代理,用于实现一个特定的预处理和后处理
 29     public class InterceptProxy :  RealProxy
 30     {
 31         private readonly MarshalByRefObject target ;
 32
 33         public InterceptProxy(MarshalByRefObject obj ,Type type) :base(type)
 34         {
 35             this.target = obj ;
 36         }
 37
 38
 39         public override IMessage Invoke(IMessage msg)
 40         {
 41             IMethodCallMessage call = (IMethodCallMessage)msg ;
 42
 43             //如果触发的是构造函数,此时target的构建还未开始
 44             IConstructionCallMessage ctor = call as IConstructionCallMessage ;
 45             if(ctor != null)
 46             {
 47                 System.Console.WriteLine("转发构造函数调用!") ;
 48
 49                 RealProxy default_proxy = RemotingServices.GetRealProxy(this.target) ; //因为远端对象也是在本地,故也要用透明代理去调用实际操作?
 50
 51                 default_proxy.InitializeServerObject(ctor) ;
 52                 MarshalByRefObject tp = (MarshalByRefObject)this.GetTransparentProxy() ;
 53
 54                 return EnterpriseServicesHelper.CreateConstructionReturnMessage(ctor,tp);
 55
 56             }
 57
 58             System.Console.WriteLine("预处理中......") ;
 59             System.Threading.Thread.Sleep(1000) ;
 60
 61             IMethodReturnMessage result_msg = RemotingServices.ExecuteMessage(this.target ,call) ;
 62
 63             System.Console.WriteLine("后处理中......") ;
 64             System.Threading.Thread.Sleep(1000) ;
 65             System.Console.WriteLine("后处理结束!") ;
 66
 67             return result_msg ;
 68
 69         }
 70     }
 71
 72
 73
 74     //定义一个特性,该特性可以将上面的真实代理与运用该特性的class联系起来
 75     [AttributeUsage(AttributeTargets.Class)]
 76     public class InterceptProxyAttribute : ProxyAttribute
 77     {
 78         //得到透明代理
 79         public override MarshalByRefObject CreateInstance(Type serverType)
 80         {
 81             System.Console.WriteLine("创建代理开始!") ;
 82             //未初始化的实例
 83             MarshalByRefObject target =  base.CreateInstance (serverType);
 84
 85             InterceptProxy rp = new InterceptProxy(target ,serverType) ;
 86 MarshalByRefObject obj = (MarshalByRefObject)rp.GetTransparentProxy();
 87             System.Console.WriteLine("创建代理结束!") ;
 88             return obj ;
 89         }
 90     }
 91
 92     [InterceptProxy]
 93     public class Example : ContextBoundObject//放到特定的上下文中,该上下文外部才会得到该对象的透明代理
 94     {
 95         private string name ;
 96         public Example(string a)
 97         {
 98             System.Console.WriteLine("开始初始化成员!") ;
 99             this.name = a ;
100         }
101
102         public void say_hello()
103         {
104             Console.WriteLine("hello ! " + name ) ;
105         }
106     }
107 }
108
109 创建代理开始!
110                                 //返回透明代理给对象
111 创建代理结束!
112                                 //对象中的透明代理发起调用
113 转发构造函数调用!
114 开始初始化成员!
115 预处理中......
116 hello ! sky
117 后处理中......
118
119
120
121 CLR里面有这么个透明代理的类(__TransparantProxy);我们既不能让自己的代理类从透明代理类派生以获得这种能力(正如大多数人希望 的那样),也不能通过自定义属性、实现标志性接口等等方法让CLR认为我们的一个类能够透明的“模仿”另一个类。要想在CLR中获取一个透明代理,需要提 供一个真实代理(real   proxy,下简称RP)。
122   一个真实代理是一个从System.Runtime.Remoting.Proxies.RealProxy派生而来的类。这个RealProxy类的首 要功能就是帮我们在运行期动态生成一个可以透明兼容于某一个指定类的透明代理类实例。怎么告诉它我们想要“模仿”的类呢?你需要在从RealProxy类 派生出来的真实代理类的构造器中显式调用该类中的一个protected   RealProxy(Type   classToProxy)构造器,传入我们需要透明代理去模仿的那个类型
123
124
125
126 2.在远程调用中
127
128 在.Net Remoting中,采用了远程代理(Remote Proxy)模式。
129 采用代理技术,使得对象可以在两个不同的应用程序域(甚至可以是两台不同的机器)之间传递。
130 代理在.Net中被分为透明代理 (Transparent Proxy)和真实代理(Real Proxy)。
131 Transparent Proxy的目标是在 CLR 中在 IL 层面最大程度扮演被代理的远端对象,从类型转换到类型获取,从字段访问到方法调用。对 CLR 的使用者来说,Transparent Proxy和被其代理的对象完全没有任何区别,只有通过 RemotingServices.IsTransparentProxy 才能区分两者的区别。
132 Real Proxy则是提供给 CLR 使用者扩展代理机制的切入点,通过从Real Proxy继承并实现 Invoke 方法,用户自定义代理实现可以自由的处理已经被从栈调用转换为消息调用的目标对象方法调用,如实现缓存、身份验证、安全检测、延迟加载等等。
133 当客户端发起一个远程调用后,透明代理为该远程调用生成一个 IMessage 对象,并将它传给实际代理。之后,实际代理会查询特定远程对象相关的配置信息,再决定加载哪些消息接收器来处理该远程调用。代理把IMessage对象传给消息接收器来处理该远程调用。
134
135 实际代理至少需要加载两个消息接收器。
136 1. 格式转换接收器(binary和soap),负责将IMessage对象序列化为数据流,最终再由网络传送出去。
137 2. 传送接收器(http和tcp),负责把数据流输送到目的地或远程服务器。
138
139 PS  透明对象和真实对象的关系
140 Activator.GetObject ()和Activator.CreateInstance()返回给客户一个代理对象。实际上得到两个代理对象,透明代理和真实代理。透明代理像远程对 象,它执行远程对象的所有公共方法,这些方法调用真实对象的Invoke()方法,传送包含方法调用的消息。
141
142 消息流动:
143 -- call-->【透明对象】--IMessage-->【实际代理】--IMessage2-->【消息接收器】(在一个调用中,编码 >>自定义前期操作>>传送到远端 >>收到应答>>自定操作后续操作>>解码)
144 参与对象:
145 RealProxy,IMessage,IClientChannelSink

0

时间: 2024-10-01 03:13:35

.net 真实代理和透明代理的交互的相关文章

图解正向代理、反向代理、透明代理

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://z00w00.blog.51cto.com/515114/1031287 套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术.一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代理.本文就是针对这三种代理来讲解一些基本原理和具体的适用范围,便于大家更深入理

图解正向代理、反向代理、透明代理(转)

转自:http://www.cnblogs.com/Anker/p/6056540.html 正向代理:代理服务器代替客户端想服务器发送请求 反向代理:客户直接访问反向代理服务器,反向代理服务器通过反向代理获取服务器内容,然后返回给客户端 透明代理:修改包,中转,透明 套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术.一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代

正向代理,反向代理和透明代理的区别

一.正向代理(Forward Proxy) 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forward)是一个位于客户端[用户A]和原始服务器(origin server)[服务器B]之间的服务器[代理服务器Z],为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端.客户端必须要进行一些特别的设置才能使用正向代理.如下图1.1 (图1.1) 从上面的概念

图解正向代理、反向代理、透明代理(反向代理可以实现负载均衡)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://z00w00.blog.51cto.com/515114/1031287 套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术.一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代理.本文就是针对这三种代理来讲解一些基本原理和具体的适用范围,便于大家更深入理

分解正向代理、反向代理、透明代理

套用古龙武侠小说套路来说,代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术.一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代理.本文就是针对这三种代理来讲解一些基本原理和具体的适用范围,便于大家更深入理解代理服务技术. 一.正向代理(Forward Proxy) 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forward)是一个位于客户端

[转]图解正向代理、反向代理、透明代理

上面的答案都说的很好,我画了张图能更直观地解释为何反向代理叫“反向“代理<img src="https://pic1.zhimg.com/480c1c45d2565e2f92fd930d25b73a18_b.jpg" data-rawwidth="522" data-rawheight="660" class="origin_image zh-lightbox-thu

nginx正向代理,反向代理,透明代理(总结)

1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容 代理服务器去取回来,然后返回给我 从网站的角度,只在代理服务器来取内容的时候有一次记录 有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站 结论就是 正向代理 是一个位于客户端和原始服务器(origin server)之间的服务

构建Squid代理服务器-传统代理、透明代理、反向代理

Squid是Linux系统中最常用的一款开源代理服务软件,主要提供缓存加速和应用层过滤控制的功能,可以很好的实现HTTP.FTP.DNS查询以及SSL等应用的缓存代理. 正向代理:根据实现的方式不同,代理服务可分为传统代理和透明代理. 传统代理:普通的代理服务,多见于Internet环境,必须在客户机的浏览器.QQ聊天工具.下载软件等程序中手动设置代理服务器对的地址和端口,才能使用代理服务器来访问网络.对于网页浏览器,访问网站时的域名解析请求会发送给指定的代理服务器. 透明代理:提供与传统代理相

正向代理,反向代理、透明代理、匿名代理、高匿名代理

代理总体来讲分正向,反向两种! 正向代理代理的客户端,就是通讯请求方.反向代理代理的是服务端,就是通讯接收方. 反向代理暂且不提,太熟了!nginx.Fikker.Traefik.haproxy随随便便能说出四五个. 今天咱们主要聊正向代理.让我们开始这段感情吧! 正向代理分透明代理,匿名和高匿名代理.这个透明,匿名,高匿名是针对信息接收方来讲的. 透明代理:对方服务器可以知道你使用了代理,并且也知道你的真实IPhttp头为:REMOTE_ADDR = 代理服务器IPHTTP_VIA = 代理服