|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着net网页编程嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。WCF是基于动静机制的,一些功效的完成如寻址,加密等在动静中城市表现的极尽描摹,WCF中的通道就像车间的流水线,而动静就作为这个流水线上待加工的产物。每经由一个处置地位,响应的通道城市抵消息对分歧的操纵处置。明晰的把握动静的加工历程对WCF的事情道理,调试跟踪,自界说扩大,功能平安都能十分好的实际意义。而要完成截获动静的目标,一般能够有以下几种举措:
1路由截获法
2自界说Binding法
3完成IMessageInspector接口法
4跟踪诊断法
四种办法,完成的难度和失掉的效果不尽不异。上面一一论述完成体例。
1路由截获法
此种办法,有能够分为两种
a)接纳现有tcp动静跟踪工具。
b)使用wcf中的路由功效做自界说的路由。
个中罕见的现成tcp动静跟踪工具,我所经常使用的是以下两个:
a)tcpTrace
b)soaptoolkit3.0中所带工具soaptraceutility
两款工具事情道理分歧,都以下图所示:
<br>
经由过程这两个工具截获Message的办法,良多伴侣们已纯熟利用。好比很早的时分Artech就在其blog文章中先容过tcpTrace的利用,文章为:[原创]我的WCF之旅(9):怎样在WCF中利用tcpTrace来举行SoapTrace。以是详细利用办法,我就不再赘述。只总结一点,在利用tcpTrace大概soaptraceutility的时分,listenport指定的是路由的监听地点,同时也应当是client端设置的via地点。而destinationport要设置的服务的监听地点。在下面的途中,listenport应当为8019,而Destinationport为8020
除利用现成的工具来做路由,WCF自己也撑持路由功效。完成道理和上图分歧。独一分歧的是两头的路由器能够由本人用WCF手艺编写。如许一来就更天真一些。做了一个十分复杂的demo,次要合用于request/reply的交互形式。
demo中有五个项目,他们分离为:
Jillzhang.Wcf.MessageInspectors.Contracts
Jillzhang.Wcf.MessageInspectors.Services
Jillzhang.Wcf.MessageInspectors.Host
Jillzhang.Wcf.MessageInspectors.Client
Jillzhang.Wcf.MessageInspectors.Rounter
后面四个是创立了一个十分复杂的WCF服务和客户端,构成了一个散布式体系。最关头的是Jillzhang.Wcf.MessageInspectors.Rounter这个项目,经由过程将ServiceContract的Action和ReplyAction设置为*,同时将其ServiceBehavior的AddressFilterMode设置为Any,就可以吸收到一切的动静,而不合错误动静的action大概动静体等举行任何选择。详细代码我不贴了,假如感乐趣能够下载demo示例代码。
好了,路由截获法的两种办法都以论述终了,那末此种办法有它的长处和弱点,它们分离是:
长处:
1)路由剖析法不必过量修正原客户端和服务真个代码,和本来架构的耦合度也对照低。
2)路由剖析法可以表现WCF中壮大的路由功效。
弱点:
路由剖析法弱点也十分明显:
1)它只能截获到已发送的哀求动静却不克不及截获响应的呼应。
2)路由法是在通信过程当中增添了节点,如许一来就没法利用高效的传输平安包管信息的平安性了。
2自界说Binding法
记得在上篇文章说说WCF中的可托赖会话中,已经谈到过Binding的构造布局。下面的形貌中,我们分歧夸大WCF是基于动静的通信体例,最主要观点的就是通道,再打一个例如,看上面一张食品消化历程图:
<br>
我们能够把动静看作成下面这幅图总的食品,而好比口腔,食道,胃,年夜肠,小肠,肛门等能够看作是对食品的举行加工的通道,他们各司其职,按次对食品举行处置。在WCF的通道(Channel)中,Channel也能对Message做林林总总的处置,好比加密,解密,编码,解码,刷选,删除,增添,修正等。我再画一张图来显现动静在通道中的处置历程:
<br>
动静会按次通道Binding中的每个BindingElement中的通道,如许我们能够完成一个自界说的Channel专门用于纪录Message.这即是在完成自界说Binding截获动静的实际根据和完成思绪。也经由过程实践编码完成了这类设法:
起首,先来懂得一下Channel的完成办法。在WCF中,Channel被构造到了System.ServiceModel.Channels的定名空间下。一切的Channel均要完成System.ServiceModel.Channels.IChannel接口。IChannel接口现实上只界说了Open,Close,Abort三各种范例的操纵,这些操纵都是基于Socket,因而每种操纵城市同步和异步的辨别。体系中还给出了上面几个经常使用的Channel接口界说:
1)IRequestChannel
在WCF中,只要完成了IRequestChannel的通道,才干成为哀求/复兴(Request/Reply)通信的哀求端。并且IRequestChannel界说了Request,这个操纵卖力将哀求动静Message发送进来,能在这个操纵中检察动静内容。别的增添了RemoteAddress和Via,分离用于暗示动静发送的远程地点和动静发送哀求的传输地点。
2)IReplyChannel
IReplyChannel和IRequestChannel绝对应,只要完成了IReplyChannel的通道才干作为Request/Reply的呼应端,而且增添了ReceiveRequest的操纵,这个操纵卖力吸收哀求,能购在这个操纵中检察动静内容。
3)IDuplexSessionChannel
这个通道界说了双工通道预会话联系关系,供应了Send,Receive的操纵,在这两个操纵中,都能检察动静内容。而且能够经由过程Session举行将IDuplexChannel与ISessionChannel举行联系关系。
其他的另有良多罕见Channel,好比IInputChannel,IOutputChannel,IDuplexChannel等,具体信息能够查阅msdn,不再赘述。但下面三个非常主要。下面两个IRequestChannel和IReplyChannel能够用在利用了HttpTransportBindingElement的Binding下面,而IDuplexSessionChannel能够用在利用了TcpTransportBindingElement的Binding下面。
经由过程Channel的可以检察动静的指定地位上log动静内容,然后完成自界说Binding,即可以完成截获动静的目标。
在完成的demo中,次要包括以下文件:
LogRequestChannel.cs:完成了IRequestChannel,用于哀求端
LogReplyChannel.cs完成了IReplyChannel,用于呼应方
LogDuplexSessionChannel.cs完成了IDuplexSessionChannel
LogChannelListerner.cs完成了IChanelListener,是服务端对通道的监听者
LogChannelFactory.cs完成了IChanelFactory,是客户端通道的办理者
LogHttpBinding.cs用于http体例的自界说的可以log动静的绑定
LogTcpBinding.cs用于tcp体例的自界说的可以log动静的绑定
检察一下最初的效果,接纳LogHttpBinding的时分的最终效果:
服务端:
<br>
客户端:
<br>
而接纳LogTcpBinding时分的最终效果:
服务端:
<br>
客户端:
<br>
从下面几幅图中,我们看出扩大Binding也能够截获到动静内容
那末这类办法有甚么优弱点呢?
长处是:
1)能截获到哀求和呼应两方面的动静
2)能了局到通道中失掉动静
3)截取地位十分天真
弱点是完成起来对照庞大
四种举措,先说这两种,上面两种留作下一篇吧,篇幅有些长,写着真累。
示例项目:http://files.cnblogs.com/jillzhang/Jillzhang.Wcf.MessageInspector.rar
本文出自:http://www.ckuyun.com/jillzhang/archive/2008/10/24/1319065.html
因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如net网页编程改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。 |
|