基本原理及其扩展机制中呢

粉碎设备2021年09月06日

现在我们可以确定通过IClientChannelSinkProvider完全可以向Pipeline中插入新的MessageSink。由于SoapClientFormatterSink的存在,我们也完全可以相信这个被插入到ChannelSink链中的MessageSink能正常的工作(即执行IMessageSink中的方法,而不是IClientChannelSink中的方法),不过为了让大家更清楚Remoting的底层实现,我们还是想探究一下它是如何调用ChannelSink链中的一个个Sink来处理消息的。下图就是调用一次远程方法所产生的序列图:

在上图中,我们可以看到在InternalInvoke方法中将调用CallProcessMessage方法,它会把消息对象交给ChannelSink链中的第一个Sink处理。如下所示:

llProcessMessage(annelSink,reqMsg,...);

代码 5

而我们在上图中可以发现CallProcessMessage方法的第一个形参是IMessageSink类型的。也就是说通过IClientChannelSinkProvider方式插入到Pipeline中的第一个Sink,反倒是IMessageSink类型的,而不是IClientChannelSink。这也为插入到ChannelSink链中的MessageSink能正常工作扫清了障碍。正是因为这个原因SoapClientFormatterSink才能发挥其作用。

另外在利用IClientChannelSinkProvider插入MessageSink的时候,必须将它插入到FormatterSink的前面。因为只有在消息被Formmat之前,我们才能通过MessageSink对它进行处理,Format之后在Sink对消息的修改就无效了。这点在配置文件中体现为自定义的SinkProvider必须放在Formatter前面。不过这是针对客户端而言,服务器端则恰恰与此相反。

<channel ref=\"http\">

<clientProviders>

<provider type=\"stomSinkProvider,CustomSinks\" />

<formatter ref=\"soap\" />

</clientProviders>

</channel>

而在客户端插入ChannelSink时,自定义的SinkProvider都是放在Formatter后面的。你可以在上一篇文章的图2中发现这点。

总结

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

并删改了顾客的充值信息。假账做出来了 下一节将介绍当Client和Server对象处在同一个Appdomain时,如何拦截并修改消息,其中将涉及到更多类型的Sink。查看本文来源

成都不孕不育医院排名
脂溢性脱发症状
骨关节炎吃什么药好
相关阅读
表白最伟大的行为,是成全

也该留给自己。暗恋最了不起的举动,是动时时。你不爱人我,但是我动时时...

2024-02-29
一位“民俗外交使者”的30年

面庞清瘦、目光不屈不挠,待人接物率性儒雅——龙宇翔,一名出色的“民间...

2023-12-23
求函数最值,一般方法和解决办法,和你想的可能不一样

求取formula_最绝对值的情况,相信大家都不陌生。平时我们用得最多的步骤,...

2023-12-16
传说中的“天选之子”?一考生选择题全选B,最高分出来后傻眼了

对于校内来却说最害怕的事就是“口试”,可是口试却又偏偏是逃不过去的死...

2023-12-15
2022招生预测分数线出炉?

2022年全国中考报名000人达到1193500人,比上一年大涨115500人,创下历史新颇高...

2023-12-04
河化的股份:第二大股东拟减持所持不超6%公司的股份

河化股票5年末20日公告,拥有者美国公司股票37,493,589股(占美国公司总股本...

2023-11-26
友情链接