remoting提供一种允许对象通过应用程序域去与另一对象进行交互的框架。如果要通过应用程序域进行通信,在remoting中要通过信道(channel)来实现。
信道
信道是跨越远程处理边界(应用程序域,进程,计算间之间)在应用程序之间传递消息的对象。信道可以在终结点监听入站消息,向基他终结点发送出站消息,或进行这两种操作。
信道须实现IChannel接口,这个接口提供了信息性属性,如:ChannelName,ChannelPriority。IChannelReceiver接口,用于监听特定端口上的特定协议的信道实现。IChannelSender接口用于发送消息的信道实现。TcpChannel和HttpChannel对象都实现了这两种接口,可以发送或接收消息。
.net 提供了几种信道实现:
(1)IpcChannel
通过使用命名管道为同一台计算机上的多进程应用程序提供高速进程间通信。它执行的功能:
·使用命名管道进行发送方和接收方的通信
·支持以二进制格式和行业标准soap序列化格式编码
·生成并使用对象引用的ChannelDataStore
·支持模拟和委托
·支持在命名管道上利用访问控制列表(ACL)来提供高级访问控制
在应用程序与本机其它进程中的另一应用程序进行通信时,优先使用IpcChannel。
(2)TcpChannel
二进制格式化程序装所有消息序列化为二进制流,并使用Tcp协议将流传输至URI,它执行以下功能:
·使用tcp socket进行发送方与接收方的通信
·支持以二进制格式和行业标准soap序列化格式编码负载
·生成并使用对象引用的ChannelDataStore
·支持模拟和委托
·支持SSPI加密
当HttpChannel连接到用TcpChannel进行监听的服务器应用程序域时,客户端将收到:基础连接已经关闭:接收时发生错误,这样的异常。存在信道不匹配的问题。
(3)HttpChannel
使用Soap协议在远程对象之间传输消息。所有的消息都通过SoapFormatter传递,这个格式化器会将消息转换为xml,然后进行序列化,同时向数据流中添加soap头。如果指定二进制格式化器,则会创建二进制数据流。最后通过http协议将数据流传输到URI。HttpChannel符合soap1.1标准,它执行以下功能:
·通过http协议在发送方和接收方之间的通信
·支持以soap和二进制格式编码负载
·将接收方设置为通过.net和tcp套接字接收http请求并发送http响应
·支持模拟和委托
·支持SSPI加密
HttpChannel一次只向给定服务器打开指定数目的连接。默认为2,可通过clientConnectionLimit属性进行设置。
使用.net remoting处理的应用程序来跨应用程序域边界进行通信,需要一个可远程处理的类的实现,一个监听或宿主应用程序域,一个客户端或调用应用程序域,同时段将每个应用程序域中的远程处理系统都配置为对可远程处理的类型使用远程激活
远程对象
为了让其它应用程序域中的对象能访问类的实例,那么这个类要从MarshalByRefObject派生。
public class RemotableType : MarshalByRefObject
{}
这个类支持远程处理的应用程序中跨应用程序域边界访问对象。
同一应用程序域中的对象直接通信。不同应用程序域中的对象的通信方式有两种:
·跨应用程序域边界传输对象副本
·通过代理交换消息
MarshalByRefObject是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。