接上一篇《Custom Channel Sinks被我征服了》
.Net 的Channel Sink是一个很系统的框架,在了解Custom Channel Sink的原理及主要接口后,接下来的内容将讨论Channel Sink相关的知识,这也算第二步吧。
在我学习的过程中,我有一个心得想和大家分享:学习的过程是一个登山的过程,你得脚踏实地,一步一步向前,如果你认为这样的速度很慢,你想找一个“速成”的方法,那么结果只有一个,你永远也不能自己爬上去,因为世界上没有这种方法。
接下来我想讨论的是如何创建Channel Sink。Channel Sink分为两种,一种在客户端上工作,执行接口为IClientChannelSink;一种在服务器上工作,执行接口为IServerChannelSink。在这两个接口中,最关键的方法是ProcessMessage。
先看一下IClientChannelSink的ProcessMessage方法定义
void ProcessMessage(
IMessage* msg,
ITransportHeaders* requestHeaders,
Stream* requestStream,
[Out] ITransportHeaders** responseHeaders,
[Out] Stream** responseStream
);
msg:需要处理的消息
requestHeaders:添加到外发消息的头信息,其目标是服务器
requestStream:发送到传输层的字节流
以上3个参数是传入参数,其作用就是将客户端的数据发往服务器。下面两个参数是返回参数,其作用是返回来自服务器的响应。
responseHeaders:返回来自服务器的头信息
responseStream:返回来自于传输层的流
再看一下IServerChannelSink的ProcessMessage方法定义
ServerProcessing ProcessMessage(
IServerChannelSinkStack* sinkStack,
IMessage* requestMsg,
ITransportHeaders* requestHeaders,
Stream* requestStream,
[Out] IMessage** responseMsg,
[Out] ITransportHeaders** responseHeaders,
[Out] Stream** responseStream
);
sinkStack:被当前Channel Sink所调用的Channel Sinks栈
requestMsg:包含请求的消息
requestHeaders:从来自于客户端的消息中检索出来的头信息
requestStream:需要被处理然后传输给反序列化Sink的流
以上3个参数为传入参数,处理的是从客户端发送过来的数据,以下三个参数为返回参数,处理的是服务器的处理结果,要返回给客户端的数据。
responseMsg:返回服务器的回应消息
responseHeaders:返回发往客户端的头信息
responseStream:返回发送给传输Sink到客户端的流。
从上面的分析,我们可以很直观的发现,客户端的ProcessMessage方法和服务器端的ProcessMessage方法构成了一个消息处理环。其处理顺序为:客户端调用代理对象->[客户端的Sinks].ProcessMessage->[服务器端的Sinks].ProcessMessage->服务器创建堆栈处理数据->[服务器端Sinks].ProcessMessage->[客户端的Sinks].ProcessMessage->客户端调用代理对象返回值。在上面的顺序表达中,客户端和服务器端的ProcessMessage顺然都被标注了两次,实际上他们只执行了一次,第二次标注,实际上是第一次调用的返回,其返回值就是上面提到的out参数。
---------------------------
这一节就写道这里吧,还是由于工作原因,不能静下心来写blog,之所以写在这里,也是想和关注.net remoting框架的朋友交流一下,剩下的还是下周写出来,有什么问题,请QQ联系我:64528619,欢迎批评!