WCF、Net remoting、Web service概念及区别
SOAP 简介
简述WebService与.NET Remoting的区别及适应场合
为了能清楚地描述Web Service 和Remoting之间的区别,我打算从他们的体系结构上来说起:
Web Service大体上分为5个层次:
1. Http传输信道
2. Xml的数据格式
3. SOAP封装格式
4. WSDL的描述方式
5. UDDI
总体上来讲,.Net 下的 Web Service结构比较简单,也比较容易理解和应用:
从实现的角度来讲,
首先WebService必须把暴露给客户端的方法所在的类继承于:System.Web.Services.WebService这个基类
其次所暴露的方法前面必须有[WebMethod]或者[WebMethodAttribute]
WebService的运行机理
通过WSDL,在客户端声称一个代理类(Proxy Class),这个代理类负责与WebService服务器进行Request 和Response.
当一个数据(Xml格式的)被封装成SOAP格式的数据流发送到服务器端的时候,就会生成一个进程对象并且把接收到这个Request的SOAP包进行解析,然后对事物进行处理,处理结束以后再对这个计算结果进行SOAP包装,然后把这个包作为一个Response发送给客户端的代理类(Proxy Class),同样地,这个代理类也对这个SOAP包进行解析处理,继而进行后续操作。
下面我们对.Net Remoting进行概括的阐述:
.Net Remoting 是在DCOM等基础上发展起来的一种技术,它的主要目的是实现跨平台、跨语言、穿透企业防火墙,这也是他的基本特点,与WebService有所不同的是,它支持HTTP以及TCP信道,而且它不仅能传输Xml格式的SOAP包,也可以传输传统意义上的二进制流,这使得它变得效率更高也更加灵活。而且它不依赖于IIS,用户可以自己开发(Development)并部署(Dispose)自己喜欢的宿主服务器,所以从这些方面上来讲WebService 其实上是.Net Remoting的一种特例。
从remoting 服务端传递一个对象给客户端,可以是对象的远程的一个远程引用,也可以使一个对象的copy,就是我们通常说的mbr 或者mbv
当然,web 服务是无法实现对象的引用传递,web 服务只能是一个mbv
比较
再次我们对WebService 以及Remoting做一个比较
WebService的特点是:平台独立性(Platform-independent)、跨语言(只要能支持Xml的语言都可以) 以及穿透企业防火墙;webservice是基于http的是无状态的;
但是它的缺点也很明显,就是需要部署一台Web Server;而且速度比较慢;
.Net Remoting的特点是
他的优点是用户既可以使用TCP信道方式进行二进制流方式通信,也可以使用HTTP信道进行SOAP格式的通信
效率相对WebService要高不少;
remoting可以用于有状态的情况;
但是它的缺点也很明显,.Net remoting只能应用于MS 的.Net framework之下。
使用场合
如果互动双方都是支持 .Net技术的环境,并且在操作系统上能提供一致的验证机制,而且很重视沟通双方作业的效率,就是 .Net Remoting上场的时机。相反的,如果沟通双方是异质环境,又或沟通的模式就是无状态的情况,持续进行的互动作业前后是没有关联的,Web Service就是理想选择了。
概括的说Remoting与Web Services的区别是:
(1)既支持TCP信道又支持HTTP信道,传输速度快
(2)即可传输XML的SOAP包又可传输二进制流,效率高
(3)Remoteing主要用于C/S结构项目
(4)不一定要依赖IIS服务器
(5)remoting 是MarshByReference的,可以传变量的引用,直接对服务器对象操作。速度快,适合intranet(企业内部互联网)
webservice 是MarshByValue的,必须传对象的值。速度慢,可以过FIREWALL,配置比较简单,适合internet(因特网)。
remoting 技术要点
Net Remoting Singleton and Singlecall 区别
在并发情况下, Singlecall效率更高.
Remoting 在服务端的一个进程里面生成一个可以在客户端的另一个进程里面可编程的对象,这就是
marshalling,有两种完全不同的方式来marshal 一个对象;
1.Marshal by value:服务端创建一个对象的copy,并把COPY传递到客户端;
在你的类里面你必须要么实现ISerializable接口,要么添加<serialazable>属性标记。
2.Marshal by reference:客户端创建该对象的代码并使用此代理来访问这个对象.最少扩展System.MarshalByRefObject 类
如果对象数据量比较小而应用程序要频繁访问这样的情况最好呢就是MBV,如果对象数据量比较大而客户机访问服务端次数相对不是很频繁,那就用MBR
channel是一个实现在应用程序域间客户端对象与服务端对象进行通讯的对象,.net framework 默认实现了以下两种 channel:
HttpChannel:使用http协议实现地一种通道;使用SOAP协议封装信息,soap协议
会把这个通讯内容以XML文件格式进行传输
TcpChannel: 使用Tcp协议实现的一种通道.使用字节码(二进制)格式地封装这些传
输信息.当然,二进制格式较为更高效一些(封装过的数据量更小),而简单的文本形式的soap 格式却是更易于在网络安全性能方面要求较高像安装有防火墙这样的环境中等工作.
注意,当你在单独的一个系统里面运用remoting 里,客户端端口号与服
务端端口号不可以相同,因为对于一个指定的端口你只可以使用一次.
WCF 技术攻关
1. MEX终结点与httpGetEnabled关系:在MEX终结点存在的情况下,是否设置httpGetEnabled是 没有区别的。
但是,如果删除MEX终结点,差异就出来了:
对于<serviceMetadata httpGetEnabled="true"/>,我们发现,Service可以运行,Client也可以调用Service。
而对于<serviceMetadata httpGetEnabled="false"/>,Service虽然可以运行,但是因为没有公布元数据终结 点,所以Client不能调用Service。
由此可见,MEX和httpGetEnabled是公布元数据终结点的两种不同方式。
MEX可以适用于任何binding,比如说TCP、HTTP。
httpGetEnabled则仅适用于HTTP。httpGetEnabled默认值为false
如果不设置<serviceMetadata httpGetEnabled="true"/>,但是仍然要保留<serviceMetadata>标签
2. WCF Endpoint作用体现:每一个 WCF 服务都会关系到地址(Address)、绑定(Binding)和契约(Contract),而 WCF 则通过 Endpoint 将 ABC 三个方面联系在一起。每一个 Endpoint 都必须包括 ABC 三个方面,缺一不可,而 host 进程会提供WCF Endpoint供客户端调用。每个 Endpoint 都对应一个唯一地址,但是多个 Endpoint 可以共享相同的绑定和契约,每个服务又可以提供多个 Endpoint 供客户端掉用。
3. WCF和Web Service比较:
两者都包括服务的本地代码文件 (反序列化生成的本地服务相关代码),WSDL服务描述文件、XSD服务结构文件。WCF框架模型一定程度上参考了以前的ASP.NET Web Service,并对此进行了扩展。
4. WCF宿主:
A.Self-Hosting(自托管宿主)
支持所有的绑定;
除了不具有易用性与 易管理性之外,在可靠性、性能等诸多方面受到很多限制。但由于它简单、易于实现,因而往往用于开发期间的调试或演示环境。
B.Windows Services宿主
支持所有的绑定;
完全克服了自托管宿主的缺点,它便于管理者方便地启动或停止服务,且在服务出现故障之后,能够重新启动服务
C.IIS&WAS宿主
(1) IIS宿主是一种主要的服务托管方 式,这是因为它具有易用性、可维护性、安全性、易于部署等多个优势。然而,它只支持HTTP协议的传输绑定。特别对于局域网场景下,如果使用IIS宿主,就无法利用TCP传输的高效率,甚至无法使用MSMQ以及Peer to Peer传输。
(2) 与IIS相比,IIS7.0提供的WAS就能支持更多的协议,比如:TCP、MSMQ等。
Wcf实例模型:
通过ServiceBehaviorAttribute控制InstanceContextMod枚举的percall,persession和single,代码:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class CounterServicePerCall:ICounterServicePerCall
分别介绍:
Percall服务:
(1) 为每个调用创建新的服务对象
(2) 增加了整体的吞吐量
(3) 状态不会在多次调用中存在
(4) 内存开销较小
(5) 不会产生并发性问题
Persession服务:
(1) 和asp.net中的session相比较,wcf中的persession是客户端发起的,而asp.net中的session是服务端初始化的。这样wcf中的session效率要高。
(2) 为每个客户端/代理创建新的服务对象(默认)
(3) 吞吐量较少,内存开销增大
(4) 状态由服务实例维护
(5) 引发多线程客户端的并发
(6) 仅当绑定支持会话时,才能够支 持会话
(7) 在服务契约上需要设置能够提供 会话功能, SessionMode 枚举(Allow(默认), NotAllowed, Required),代码:
[ServiceContract(SessionMode=SessionMode.Required)]
public interface ICounterServiceSession
{
[OperationContract]
int IncrementCounter();
}
(8) SessionId信道的属性:
SessionServiceClient proxy=new SessionServiceClient ();
string s = proxy.InnerChannel.SessionId;
(9) 会话的生命周期默认是10分钟,如需要设置,代码如下:
<netTcpBinding>
<binding name="netTcp" receiveTimeout="00:10:00" />
</netTcpBinding>
还可以通过操作显式地控制生命周 期,设置OperationContractAttribute的
IsInitiating(是否创 建) 与IsTerminating(是否终止)属性,代码:
[ServiceContract(SessionMode = SessionMode.Required)]
public interface ISessionService
{
[OperationContract(IsInitiating = true, IsTerminating =false)]
void StartSession();
[OperationContract(IsInitiating = false, IsTerminating =false)]
void IncrementCounter();
[OperationContract(IsInitiating = false, IsTerminating =false)]
int GetCounter();
[OperationContract(IsInitiating = false, IsTerminating =false)]
string GetSessionId();
[OperationContract(IsInitiating = false, IsTerminating =true)]
void StopSession();
}
单件模式single:
(1) 为所有客户端的所有调用创建单一的服务对象
(2) 需要处理并发性问题。
(3) 通常要避免使用单件模型