.net 真实代理和透明代理的交互
.本地代理调用 using System;
using System.Runtime.Remoting ;
using System.Runtime.Remoting.Services ;
using System.Runtime.Remoting.Activation ;
using System.Runtime.Remoting.Proxies ;
using System.Runtime.Remoting.Messaging ; /*
本程序说明了截获是如何进行的,以及真实代理和透明代理之间的关系及交互。
*/
namespace Intercept_example
{
class Class1
{
private static string[] gg={"sdf", "fsddx"};
[STAThread]
static void Main(string[] args)
{
Example exa = new Example("sky" ) ;
exa.say_hello() ;
}
} //定义一个真实代理,用于实现一个特定的预处理和后处理
public class InterceptProxy : RealProxy
{
private readonly MarshalByRefObject target ; public InterceptProxy(MarshalByRefObject obj ,Type type) :base(type)
{
this.target = obj ;
} public override IMessage Invoke(IMessage msg)
{
IMethodCallMessage call = (IMethodCallMessage)msg ; //如果触发的是构造函数,此时target的构建还未开始
IConstructionCallMessage ctor = call as IConstructionCallMessage ;
if(ctor != null)
{
System.Console.WriteLine("转发构造函数调用!") ; RealProxy default_proxy = RemotingServices.GetRealProxy(this.target) ; //因为远端对象也是在本地,故也要用透明代理去调用实际操作? default_proxy.InitializeServerObject(ctor) ;
MarshalByRefObject tp = (MarshalByRefObject)this.GetTransparentProxy() ; return EnterpriseServicesHelper.CreateConstructionReturnMessage(ctor,tp); } System.Console.WriteLine("预处理中......") ;
System.Threading.Thread.Sleep() ; IMethodReturnMessage result_msg = RemotingServices.ExecuteMessage(this.target ,call) ; System.Console.WriteLine("后处理中......") ;
System.Threading.Thread.Sleep() ;
System.Console.WriteLine("后处理结束!") ; return result_msg ; }
} //定义一个特性,该特性可以将上面的真实代理与运用该特性的class联系起来
[AttributeUsage(AttributeTargets.Class)]
public class InterceptProxyAttribute : ProxyAttribute
{
//得到透明代理
public override MarshalByRefObject CreateInstance(Type serverType)
{
System.Console.WriteLine("创建代理开始!") ;
//未初始化的实例
MarshalByRefObject target = base.CreateInstance (serverType); InterceptProxy rp = new InterceptProxy(target ,serverType) ;
MarshalByRefObject obj = (MarshalByRefObject)rp.GetTransparentProxy();
System.Console.WriteLine("创建代理结束!") ;
return obj ;
}
} [InterceptProxy]
public class Example : ContextBoundObject//放到特定的上下文中,该上下文外部才会得到该对象的透明代理
{
private string name ;
public Example(string a)
{
System.Console.WriteLine("开始初始化成员!") ;
this.name = a ;
} public void say_hello()
{
Console.WriteLine("hello ! " + name ) ;
}
}
} 创建代理开始!
//返回透明代理给对象
创建代理结束!
//对象中的透明代理发起调用
转发构造函数调用!
开始初始化成员!
预处理中......
hello ! sky
后处理中...... CLR里面有这么个透明代理的类(__TransparantProxy);我们既不能让自己的代理类从透明代理类派生以获得这种能力(正如大多数人希望 的那样),也不能通过自定义属性、实现标志性接口等等方法让CLR认为我们的一个类能够透明的“模仿”另一个类。要想在CLR中获取一个透明代理,需要提 供一个真实代理(real proxy,下简称RP)。
一个真实代理是一个从System.Runtime.Remoting.Proxies.RealProxy派生而来的类。这个RealProxy类的首 要功能就是帮我们在运行期动态生成一个可以透明兼容于某一个指定类的透明代理类实例。怎么告诉它我们想要“模仿”的类呢?你需要在从RealProxy类 派生出来的真实代理类的构造器中显式调用该类中的一个protected RealProxy(Type classToProxy)构造器,传入我们需要透明代理去模仿的那个类型 .在远程调用中 在.Net Remoting中,采用了远程代理(Remote Proxy)模式。
采用代理技术,使得对象可以在两个不同的应用程序域(甚至可以是两台不同的机器)之间传递。
代理在.Net中被分为透明代理 (Transparent Proxy)和真实代理(Real Proxy)。
Transparent Proxy的目标是在 CLR 中在 IL 层面最大程度扮演被代理的远端对象,从类型转换到类型获取,从字段访问到方法调用。对 CLR 的使用者来说,Transparent Proxy和被其代理的对象完全没有任何区别,只有通过 RemotingServices.IsTransparentProxy 才能区分两者的区别。
Real Proxy则是提供给 CLR 使用者扩展代理机制的切入点,通过从Real Proxy继承并实现 Invoke 方法,用户自定义代理实现可以自由的处理已经被从栈调用转换为消息调用的目标对象方法调用,如实现缓存、身份验证、安全检测、延迟加载等等。
当客户端发起一个远程调用后,透明代理为该远程调用生成一个 IMessage 对象,并将它传给实际代理。之后,实际代理会查询特定远程对象相关的配置信息,再决定加载哪些消息接收器来处理该远程调用。代理把IMessage对象传给消息接收器来处理该远程调用。 实际代理至少需要加载两个消息接收器。
. 格式转换接收器(binary和soap),负责将IMessage对象序列化为数据流,最终再由网络传送出去。
. 传送接收器(http和tcp),负责把数据流输送到目的地或远程服务器。 PS 透明对象和真实对象的关系
Activator.GetObject ()和Activator.CreateInstance()返回给客户一个代理对象。实际上得到两个代理对象,透明代理和真实代理。透明代理像远程对 象,它执行远程对象的所有公共方法,这些方法调用真实对象的Invoke()方法,传送包含方法调用的消息。 消息流动:
-- call-->【透明对象】--IMessage-->【实际代理】--IMessage2-->【消息接收器】(在一个调用中,编码 >>自定义前期操作>>传送到远端 >>收到应答>>自定操作后续操作>>解码)
参与对象:
RealProxy,IMessage,IClientChannelSink
0
.net 真实代理和透明代理的交互的更多相关文章
- nginx正向代理,反向代理,透明代理(总结)
1正向代理 正向代理,也就是传说中的代理,他的工作原理就像一个跳板, 简单的说, 我是一个用户,我访问不了某网站,但是我能访问一个代理服务器 这个代理服务器呢,他能访问那个我不能访问的网站 于是我先连 ...
- (大型网站之Nginx)图解正向代理、反向代理、透明代理
一.正向代理(Forward Proxy) 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forward)是一个位于客户端[用户A]和原始服务器(o ...
- squid详解(正向代理、透明代理、反向代理)
squid http://www.squid-cache.org/ --官方网址 squid软件主要有两大应用:1,代理上网(正向代理,透明代理) 2,网站静态页面缓存加速(反向代理) 三种代理类型: ...
- Squid代理之透明代理
二.透明代理 1.检测squid是否安装
- linux下正向代理/反向代理/透明代理使用说明
代理服务技术对于网站架构部署时非常重要的,一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术.常用的代理技术分为正向代理.反向代理和透明代理.以下就是针对这 ...
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中
[大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...
- 正向代理 & 反向代理 & 透明代理
正向代理(Forward Proxy) 概述 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正 向代理(forward)是一个位于客户端[用户A]和原始服务器 ...
- squid 透明代理配置
阿铭在教程中已经介绍过squid的安装和配置,http://study.lishiming.net/chapter22.html 教程中只介绍了初级的正向代理和反向代理,这篇文档将要介绍透明代理如何配 ...
- squid配置透明代理
搞了半个月的squid普通代理和透明代理最终差点儿相同了!! squid配置透明代理主要有两步.见图: 第一个基本的步骤:设置client默认网关,让默认网关指向squid代理server water ...
随机推荐
- Codeforces Round #328 (Div. 2) C 数学
C. The Big Race time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- 3.3 Lucene检索原理
Lucene是一个高效的,基于Java的全文检索库[1].所以在介绍Lucene的检索功能之前,我们要先了解一下全文检索以及Lucene的索引结构. 一.全文检索的基本原理 1. 数据的分类 什么是全 ...
- php格式化时间
1.Y 年份的四位数 2.m 月份的数字(01-12) 3.d 一个月中的第几天(01-31) 4.w 星期几的数字表示(0-6) 5.H 24小时制(00-23) 6.i 分(00-59) 7.s ...
- 飞镖(bzoj 2335)
Description 飞镖是在欧洲颇为流行的一项运动.它的镖盘上分为20个扇形区域,分别标有1到20的分值,每个区域中有单倍.双倍和三倍的区域,打中对应的区域会得到分值乘以倍数所对应的分数.例如打中 ...
- Action中动态方法的调用 Action中通配符的使用 Result的配置
Action中动态方法的调用 动态方法调用(Dynamic Method Invocation,DMI) 标识符:! 一.通过以下选中的文件来查看是否禁止调用动态方法
- UVA 306 Cipher
题意 :lucky cat里有翻译.英文也比较好懂. 很容易发现有周期然后就拍就好了 注意每组数据后边都有空行 包括最后一组.一开始以为最后一组没有空行.唉.. #include <map> ...
- 无类型指针 在delphi中可以直接赋值任何指针类型。
- python3正则表达式符号和用法
- appium+python自动化24-滑动方法封装(swipe)【转载】
swipe介绍 1.查看源码语法,起点和终点四个坐标参数,duration是滑动屏幕持续的时间,时间越短速度越快.默认为None可不填,一般设置500-1000毫秒比较合适. swipe(self, ...
- PhpStorm 快捷键大全 PhpStorm 常用快捷键和配置+如何关闭快捷键ctrl+alt+方向键旋转屏幕
如果映射的是eclipse的快捷键,又同时安装了英特尔的GPU软件,那么会有这个快捷键冲突 就是快速复制快捷键:ctrl+alt+方向键 会调用英特尔旋转屏幕,禁用掉即可 PhPStorm 是 Je ...