学习了Remoting
一种分布式架构(实现,在别一台主机上的类或程序组,通过Remoting开通的通道,可以在另一台机子上调用这些类及程序组)。
1、通道
通道现有TCP及HTTP两种。
2、激活模式
1)、服务端激活
服务端激活有两种模式:Singleton 和 SingleCall
Singleton 类型任何时候都不会同时具有多个实例。如果存在实例,所有客户端请求都由该实例提供服务。如果不存在实例,服务器将创建一个实例,而所有后继的客户端请求都将由该实例来提供服务。由于 Singleton 类型具有关联的默认生存期,即使任何时候都不会有一个以上的可用实例,客户端也不会总接收到对可远程处理的类的同一实例的引用。
SingleCall 远程服务器类型总是为每个客户端请求设置一个实例。下一个方法调用将改由其他实例进行服务。从设计角度看,SingleCall 类型提供的功能非常简单。这种机制不提供状态管理,如果您需要状态管理,这将是一个不利之处;如果您不需要,这种机制将非常理想。也许您只关心负载平衡和可伸缩性而不关心状态,那么在这种情况下,这种模式将是您理想的选择,因为对于每个请求都只有一个实例。如果愿意,开发人员可以向 SingleCall 对象提供自己的状态管理,但这种状态数据不会驻留在对象中,因为每次调用新的方法时都将实例化一个新的对象标识。
config配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="conn" value="server=10.10.48.123\oo-pc;database=Leo;uid=sa;pwd=123456"/>
<add key="filepath" value="C:\sss\"/>
</appSettings>
<system.runtime.remoting>
<application name="RemoteServer">
<service>
<!--单实例,每一次激活调用会共用一个对应的实例,mode:Singleton-->
<!--<wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject"
mode="Singleton" />-->
<!--多实例,每一次激活调用会有一个对应的实例,mode:SingleCall-->
<wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject"
mode="SingleCall" />
</service>
<channels>
<channel ref="tcp" port="9999"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
服务端引用:
RemotingConfiguration.Configure("RemotingServer001.exe.config",false);
2)、客户端激活
客户端激活的时间是在客户端请求的时候,而服务端激活远程对象的时间是在调用对象方法的时候
config配置如下:
<configuration>
<system.runtime.remoting>
<application name="RemoteServer">
<service>
<activated type="RemoteObject.MyObject,RemoteObject"/>
</service>
<channels>
<channel ref="tcp" port="9999"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
调用:
//客户端激活的时间是在客户端请求的时候(可以调带参数构造方法),而服务端激活远程对象的时间是在调用对象方法的时候
//服务器端激活模式
app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),
System.Configuration.ConfigurationManager.AppSettings["ServiceURL"]);
//客户端激活模式
//RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.CreateInstance(typeof(RemoteObject.MyObject),
// null, new object[] { new System.Runtime.Remoting.Activation.UrlAttributeSystem.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]) });
一种分布式架构(实现,在别一台主机上的类或程序组,通过Remoting开通的通道,可以在另一台机子上调用这些类及程序组)。
1、通道
通道现有TCP及HTTP两种。
2、激活模式
1)、服务端激活
服务端激活有两种模式:Singleton 和 SingleCall
Singleton 类型任何时候都不会同时具有多个实例。如果存在实例,所有客户端请求都由该实例提供服务。如果不存在实例,服务器将创建一个实例,而所有后继的客户端请求都将由该实例来提供服务。由于 Singleton 类型具有关联的默认生存期,即使任何时候都不会有一个以上的可用实例,客户端也不会总接收到对可远程处理的类的同一实例的引用。
SingleCall 远程服务器类型总是为每个客户端请求设置一个实例。下一个方法调用将改由其他实例进行服务。从设计角度看,SingleCall 类型提供的功能非常简单。这种机制不提供状态管理,如果您需要状态管理,这将是一个不利之处;如果您不需要,这种机制将非常理想。也许您只关心负载平衡和可伸缩性而不关心状态,那么在这种情况下,这种模式将是您理想的选择,因为对于每个请求都只有一个实例。如果愿意,开发人员可以向 SingleCall 对象提供自己的状态管理,但这种状态数据不会驻留在对象中,因为每次调用新的方法时都将实例化一个新的对象标识。
config配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="conn" value="server=10.10.48.123\oo-pc;database=Leo;uid=sa;pwd=123456"/>
<add key="filepath" value="C:\sss\"/>
</appSettings>
<system.runtime.remoting>
<application name="RemoteServer">
<service>
<!--单实例,每一次激活调用会共用一个对应的实例,mode:Singleton-->
<!--<wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject"
mode="Singleton" />-->
<!--多实例,每一次激活调用会有一个对应的实例,mode:SingleCall-->
<wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject"
mode="SingleCall" />
</service>
<channels>
<channel ref="tcp" port="9999"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
服务端引用:
RemotingConfiguration.Configure("RemotingServer001.exe.config",false);
2)、客户端激活
客户端激活的时间是在客户端请求的时候,而服务端激活远程对象的时间是在调用对象方法的时候
config配置如下:
<configuration>
<system.runtime.remoting>
<application name="RemoteServer">
<service>
<activated type="RemoteObject.MyObject,RemoteObject"/>
</service>
<channels>
<channel ref="tcp" port="9999"/>
</channels>
</application>
</system.runtime.remoting>
</configuration>
调用:
//客户端激活的时间是在客户端请求的时候(可以调带参数构造方法),而服务端激活远程对象的时间是在调用对象方法的时候
//服务器端激活模式
app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),
System.Configuration.ConfigurationManager.AppSettings["ServiceURL"]);
//客户端激活模式
//RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.CreateInstance(typeof(RemoteObject.MyObject),
// null, new object[] { new System.Runtime.Remoting.Activation.UrlAttributeSystem.Configuration.ConfigurationSettings.AppSettings["ServiceURL"]) });