WCF是对于Webservice,.Net Remoting,Enterprise Service,WSE,MSMQ等技术的整合。那么他与Remoting和Webservice有什么关系呢?
既然他是对Remoting,Webservice等技术的整合,那么我们先来看一下Remoting,Webservice的架构,下图是Remoting的架构图,实际上Webservice和Remoting差不多,也是这样的架构,只是少了些东西,再后面我们会讲解,先来看一下图:
我们先来讲解Remoting:
1.远程处理对象(MBR):由于Remoting传递的对象是以引用的方式,因此所传递的远程对象类必须继承MarshalByRefObject。MarshalByRefObject 是那些通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类。
2.WKO和CAO:在访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程创建它并进行初始化。这种客户端通过通道来创建远程对象,称为对象的激活。在Remoting中,远程对象的激活分为两大类:WKO和CAO:
(1) 服务器端激活(WKO),又叫做WellKnow方式,很多又翻译为知名对象。为什么称为知名对象激活模式呢?是因为服务器应用程序在激活对象实例之前会在一个众所周知的统一资源标识符(URI)上来发布这个类型。然后该服务器进程会为此类型配置一个WellKnown对象,并根据指定的端口或地址来发布对象,不能使用有参数的远程对象构造函数,即远程对象必须要有无参构造函数。.Net Remoting把服务器端激活又分为SingleTon模式和SingleCall模式两种。
Singleton模式:也就是说对象只有唯一的一个,也就是我们用到的GOF23中的Singleton(单件模式),SingleCall模式:会为每一个客户端建立一个远程对象实例.
(2) 客户端激活(CAO)。与WellKnown模式不同,Remoting在激活每个对象实例的时候,会给每个客户端激活的类型指派一个URI。CAO与WKO的使用区别在于,CAO能使用有参数的远程对象构造函数.
3.调度程序:可以host到exe中,或者服务中(Windows,IIS).
4.格式化程序和信道:对远程处理对象做格式化以后,按照固定的信道传递到客户端.
Remoting的信道主要有两种:Tcp和Http。Tcp信道提供了基于Socket的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流.TcpChannel使用二进制格式序列化消息对象,因此它具有更高的传输性能。HttpChannel类型使用Soap格式序列化消息对象,因此它具有更好的互操作性,格式化程序和信道是相互对应的.关于格式化的类型.net有三种:XML,SOAP,Binary.请看下图:
客户端代理:上面我们说过Remoting按引用来传递格式化好的远程处理对象,然后在客户端生成这个对象的代理,来完成业务操作.
ok,我们知道了Remoting的工作方式,下面我们来看看WebService的工作方式是怎样的,前面我们说过Remoting和Webservice大致的架构相同,但是又有不同的地方,它的不同就在服务器端的远程处理对象和激活方式,以及格式化和信道,还有客户端的代理.
1.远程处理对象(MBV):Webservice是按照值传递的对象,她继承自MarshalByValueComponent,该类是由值封送的(传递序列化对象的副本).(Remoting是引用传递)
2.激活方式:WKO,Webservice是WKO激活的,而且是SingleCall模式.(Remoting是WKO+CAO)
3.调度程序:host到IIS.(Remoting可以Host到很多种的.net应用程序中)
4.格式化程序和信道:对远程处理对象做格式化以后,按照固定的信道传递到客户端.
Webservice的信道主要有两种(实际上不能说是两种信道,而是两种格式化方式):SOAP和Http。SOAP类型使用Soap格式序列化消息对象,而HTTP则使用XML来格式化(Remoting是TCP和Http)
5.客户端的代理:在Webservice中,这个代理是远程对象的副本.(Remoting是远程对象的引用)
虽然知道了他们的这些区别,但是还有更重要的几点 Webservice不需要客户端安装.net但是性能不如Remoting;Remoting需要安装.net,但是性能高.而WCF的出现就是整合封装了他们(当然不止Webservice和Remoting),让你的Remoting可以变成Webservice,而Webservice可以变为Remoting,只需要简单的配置即可,其实现原理还是上面的第一张图.关于WCF开发的文章园子里有很多很好的,这里就不在赘述了.