.NET Remoting程序开发入门篇(五)
来源:互联网 发布:java多态原理 编辑:程序博客网 时间:2024/06/05 06:17
五、Remoting基础的补充
通过上面的描述,基本上已经完成了一个最简单的Remoting程序。这是一个标准的创建Remoting程序的方法,但在实际开发过程中,我们遇到的情况也许千奇百怪,如果只掌握一种所谓的“标准”,就妄想可以“一招鲜、吃遍天”,是不可能的。
1、注册多个通道
在Remoting中,允许同时创建多个通道,即根据不同的端口创建不同的通道。但是,Remoting要求通道的名字必须不同,因为它要用来作为通道的唯一标识符。虽然IChannel有ChannelName属性,但这个属性是只读的。因此前面所述的创建通道的方法无法实现同时注册多个通道的要求。
这个时候,我们必须用到System.Collection中的IDictionary接口:
注册Tcp通道:
tcpProp["name"] = "tcp9090";
tcpProp["port"] = 9090;
IChannel channel = new TcpChannel(tcpProp,
new BinaryClientFormatterSinkProvider(),
new BinaryServerFormatterSinkProvider());
ChannelServices.RegisterChannel(channel);
httpProp["name"] = "http8080";
httpProp["port"] = 8080;
IChannel channel = new HttpChannel(httpProp,
new SoapClientFormatterSinkProvider(),
new SoapServerFormatterSinkProvider());
ChannelServices.RegisterChannel(channel);
{
Person GetPersonInfo(string name,string sex,int age);
}
public class ServerObject:MarshalByRefObject,IServerObject
{ ......}
通过上面的描述,基本上已经完成了一个最简单的Remoting程序。这是一个标准的创建Remoting程序的方法,但在实际开发过程中,我们遇到的情况也许千奇百怪,如果只掌握一种所谓的“标准”,就妄想可以“一招鲜、吃遍天”,是不可能的。
1、注册多个通道
在Remoting中,允许同时创建多个通道,即根据不同的端口创建不同的通道。但是,Remoting要求通道的名字必须不同,因为它要用来作为通道的唯一标识符。虽然IChannel有ChannelName属性,但这个属性是只读的。因此前面所述的创建通道的方法无法实现同时注册多个通道的要求。
这个时候,我们必须用到System.Collection中的IDictionary接口:
注册Tcp通道:
IDictionary tcpProp = new Hashtable();
tcpProp["name"] = "tcp9090";
tcpProp["port"] = 9090;
IChannel channel = new TcpChannel(tcpProp,
new BinaryClientFormatterSinkProvider(),
new BinaryServerFormatterSinkProvider());
ChannelServices.RegisterChannel(channel);
注册Http通道:
IDictionary httpProp = new Hashtable();
httpProp["name"] = "http8080";
httpProp["port"] = 8080;
IChannel channel = new HttpChannel(httpProp,
new SoapClientFormatterSinkProvider(),
new SoapServerFormatterSinkProvider());
ChannelServices.RegisterChannel(channel);
在name属性中,定义不同的通道名称就可以了。
2、远程对象元数据相关性
由于服务器端和客户端都要用到远程对象,通常的方式是生成两份完全相同的对象Dll,分别添加引用。不过为了代码的安全性,且降低客户端对远程对象元数据的相关性,我们有必要对这种方式进行改动。即在服务器端实现远程对象,而在客户端则删除这些实现的元数据。
由于激活模式的不同,在客户端创建对象的方法也不同,所以要分离元数据的相关性,也应分为两种情况。
(1) WellKnown激活模式:
通过接口来实现。在服务器端,提供接口和具体类的实现,而在客户端仅提供接口:
public interface IServerObject
{
Person GetPersonInfo(string name,string sex,int age);
}
public class ServerObject:MarshalByRefObject,IServerObject
{ ......}
注意:两边生成该对象程序集的名字必须相同,严格地说,是命名空间的名字必须相同。
(2) 客户端激活模式:
如前所述,对于客户端激活模式,不管是使用静态方法,还是使用CreateInstance()方法,都必须在客户端调用构造函数实例化对象。所以,在客户端我们提供的远程对象,就不能只提供接口,而没有类的实现。实际上,要做到与远程对象元数据的分离,可以由两种方法供选择:
a、利用WellKnown激活模式模拟客户端激活模式:
方法是利用设计模式中的“抽象工厂”,下面的类图表描述了总体解决方案:
- .NET Remoting程序开发入门篇(五)
- ASP.NET Remoting程序开发入门篇
- .NET Remoting程序开发入门篇(一)
- .NET Remoting程序开发入门篇(二)
- .NET Remoting程序开发入门篇(三)
- .NET Remoting程序开发入门篇(六)
- .NET Remoting程序开发入门篇(七)
- .NET Remoting程序开发入门篇(八)
- NET Remoting程序开发入门篇
- .NET Remoting程序开发入门篇
- .NET Remoting程序开发入门篇
- .NET Remoting程序开发入门篇http://www.it201.com/jianzhan/wzkf/aspnet/200611/10743.html
- .Net Remoting 入门
- .Net Remoting 入门
- .Net Remoting 小程序
- 回顾.NET Remoting分布式开发
- Net Remoting基础篇
- Net Remoting基础篇
- HIBERNATE检索对象方式
- PDA 开发入门大全
- OpenSocial API 概述
- Google Gadgets (1):从 Hello World 开始
- 建表存储过程建在了错误的库上解决方法
- .NET Remoting程序开发入门篇(五)
- .NET Remoting程序开发入门篇(六)
- 图算法-接口及实现
- document.createElement創建控件
- .NET Remoting程序开发入门篇(七)
- (* (void ( * )() 0 ) ()说明和由来
- .NET Remoting程序开发入门篇(八)
- 白玉兰
- 委屈