.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 ...
随机推荐
- Java代码实现真分页
在JavaWeb项目中,分页是一个非常常见且重要的一个小方面.本次作为记载和学习,记录项目中出现的分页并做好学习记录.在这里,用的是SSH框架.框架可以理解如下图: 在JSP页面,描写的代码如下: & ...
- Linux命令之time
我使用过的Linux命令之time - 测定一个命令的资源使用情况 本文链接:http://codingstandards.iteye.com/blog/798788 (转载请注明出处) 用途说明 ...
- 解决hibernate向mysql插入中文乱码问题(更改MySQL字符集)
1.首先需要修改mysql数据库的配置文件my.ini,此文件放在mysql根目录下.在此文件下查找default-character-set属性,并将其值更改为utf8(注意:不是utf-8,也要注 ...
- Java Nio注意事项
Selector : public abstract class Selector extends Object SelectableChannel 对象的多路复用器. 可通过调用此类的 open ...
- Html5学习进阶三 Input 类型
HTML5 新的 Input 类型 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证. 本章全面介绍这些新的输入类型: email url number range Date ...
- [ CodeVS冲杯之路 ] P1068
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1068/ 这是一道神DP题,一开始状态设计错了,用位置和剩余卡片做下标,过了样例数据WA了 好了,讲正解,设 f[i][ ...
- 飞扬的小鸟(NOIP2014)(丧病DP题)
原题传送门 刚开始我还以为这道题目非常的简单.. 然后随便打了一个DP,直接WA,被zxyer狠狠地D了一顿. 然后发现有好多细节.. 首先假如某横坐标没有管子,那么l[x]=0;h[x]=m+1; ...
- 多线程之:java线程创建
java中创建线程有两种方式: 1.继承Thread类,重写run()方法,如: public class MyThread extends Thread { public void run(){ S ...
- 推荐一本迷你中文书《JavaScript Promise迷你书(中文版)》
https://github.com/azu/promises-book http://it-ebooks24.com/ebook/mastering-javascript-promises 传值,调 ...
- JAVA SERVLET 属性范围样例
package com.jeelearning.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; ...