下面来看看Remoting具体如何工作,本文将用一些示范代码展示如何在一个Web服务中设置它。
虽然Web服务总体上说是从公司外部的客户端访问组件的最佳方式,但公司内部的组件又如何呢?许多公司的Web服务是在内部使用的。使用Web服务本身并没有错,只是它无法提供最佳的性能。如果组件是用.NET创建的,而且客户端应用程序也是.NET,就可将组件放到共享服务器上,并通过Remoting来访问它们。
Remoting是用于取代DCOM的一种.NET技术,它采用二进制格式在客户端应用程序和组件之间通信。这样一来,远程组件的速度快于Web服务。但是,创建远程组件的难度较大,因为你必须在自己的组件中添加附加的代码。这些代码虽然并不比Web服务的代码复杂多少,但你不能直接实例化一个远程组件。相反,必须创建一个主机应用程序,由它实例化组件并侦听请求。好消息是,这个主机可以是一个Windows服务、Windows应用程序、控制台应用程序或者能够运行并保持对象打开状态的其他任何东西。
你不仅要创建主机应用程序,还必须做出有关远程对象的几项决策,比如要使用哪个通道(channel)。.NET支持HTTP和TCP通道。HTTP通道实际使用SOAP协议将消息传输给远程对象,或者从远程对象传回消息。这意味着所有消息都要序列化成XML格式。TCP通道则使用一个二进制的流来传输消息。
接着,必须在两种激活模式中选择其一:Singleton和SingleCall。其中,Singleton类型在任何时候都只有对象的一个实例。所有客户端请求都由那个实例提供服务。这样就允许你在请求之间“共享”数据,或者在不同请求之间维持状态。另一方面,SingleCall类型会为每个客户端请求都创建一个新的对象实例。SingleCall对象更像是Web服务,因为它们是无状态的,而且会针对每个请求创建和销毁。
远程组件在改变通道时,不需要重新编译,这一点要归功于.NET巧妙的设计。你可将通道文件放到一个配置文件中,并从TCP变成HTTP,或从HTTP变成TCP,应用程序无需重新编译。类似地,你可为客户端更改配置文件,与主机使用的通道相匹配。