您的位置:首页 > 其它

[ZZ]Remoting基本原理及其扩展机制(中)

2011-04-07 10:08 357 查看
上一篇文章
们已经介绍到通过在配置文件中指定自定义的ChannelSinkProvider,我们可以在Pipeline中加入自己的ChannelSink,此
时我们就可以加入自己的信息处理模块,但是这里我们所能操作的对象是已经经过格式化的消息(即数据流),我们看不到原始的消息对象,这也势必影响了我们所
能实现的扩展功能。而在上文的图1中,
我们看到除了ChannelSink可以扩展之外,我们还可以加入自定义的MessageSink,而它是位于格式器之前的,也就是说在
MessageSink中我们可以直接操作尚未格式化的消息对象。此时,我们就获得一个功能更强大的扩展点。直接操作消息对象,这意味着什么呢?简单来
说,我们可以在这里实现方法拦截,我们可以修改方法的参数、返回值,在调用方法前后加入自己的处理逻辑。是不是觉得听上去很耳熟?没错,这就也正是AOP
所要实现的一个目标。下面,在了解了整个Remoting的大背景以及ChannelSink的扩展机制后,我们将对MessageSink的扩展机制做
进一步介绍。

在介绍前,我先提醒各位读者注意以下几点:

1. 确定你确实想深入了解Remoting的内部机制;

2. 确定你能很好的理解上一篇文章;

3. 如果说上一篇文章总结归纳的内容较多的话,在本文中出现的内容大多是笔者个人的探索,我想其他资料(包括英文资料)中都不曾介绍过这些内容,所以我不保证所有观点的正确性,如果你觉得哪里有误,也欢迎你在评论中提出你的意见。

下面就让我们开始品尝大餐吧。 :)

利用ChannelSinkProvider扩展MessageSink

MessageSink的扩展有两种实现方法,让我先从简单的开始。在上一篇文章我们已经介绍到通过在配置文件中指定自定义的
ChannelSinkProvider,我们可以在Pipeline中加入自己的ChannelSink。那么有没有一个类似于
IClientChannelSinkProvider的IMessageSinkProvider呢?可惜答案是否定的。那么我们能否通过
IClientChannelSinkProvider插入一个MessageSink呢?插入之后它又能否发挥其功效呢?

首先我们先实现一个自定义的MessageSink。此时只需新建一个类,并实现IMessageSink接口中的
SyncProcessMessage方法(为简单起见我们只考虑同步调用模式),在方法中我们可以直接操作Message对象,比如我们可以向
Message中加入额外的属性,如下所示:

[code]View Code

[code]public class SoapClientFormatterSink :IMessageSink, IClientChannelSink//...
{
//...
//Implement method in IMessageSink
public IMessage SyncProcessMessage(IMessage msg)
{
IMethodCallMessage message1 = (IMethodCallMessage) msg;
try
{
ITransportHeaders headers1;
Stream stream1;
Stream stream2;
ITransportHeaders headers2;
this.SerializeMessage(message1, out headers1, out stream1);
this._nextSink.ProcessMessage(msg, headers1, stream1, out headers2, out stream2);
if (headers2 == null)
{
throw new ArgumentNullException("returnHeaders");
}
return this.DeserializeMessage(message1, headers2, stream2);
}
catch (Exception exception1)
{
return new ReturnMessage(exception1, message1);
}
catch
{
return new ReturnMessage(new Exception("...")), message1);
}
}

//Implement method in IClientChannelSink
public void ProcessMessage(...)
{
throw new NotSupportedException();
}
//...
}


总结

本节中主要介绍了如何利用IClientChannelSinkProvider向Pipeline中加入MessageSink,从而在远程方法调用中
修改消息对象,实现功能更强大的扩展。并由此介绍了Remoting在实现此功能时,它的内部实现机制,有助于大家更深入地了解Remoting框架。

下一节将介绍当Client和Server对象处在同一个Appdomain时,如何拦截并修改消息,其中将涉及到更多类型的Sink。

原文出处:http://www.cnblogs.com/idior/archive/2007/01/09/614995.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: