raindust

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

一、Net 远程处理基本知识

    三种基本类型的类
          可序列化的类:这些类属性被Serializable标记,用来在程序及系统之间传递。可序列化的类要求每个成员及其应用的对象可序列化。不想序列化的成员可以使用NonSerialized标记。
          可远程调用的类:这些类都是System.MarshalByRefObject的派生类。用公共的属性、方法和成员变量都可被原端调用。
          普通类:辅助完成远程处理,不参与调用与传输,运行于本地计算机。

    NET远程组件宿主
           所有的远程可调用的类,必须宿主在一个用来侦听请求并创建合适对象的服务系统上,才能完成远程调用的过程。这个服务系统成为远程组件宿主。
   一个宿主组件应该完成两个任务:第一创建服务端信道来侦听客户端请求。当收到客户端请求时,NET远程处理框架自动在宿主组件的应用程序域中生成所需的远程对象。
   远程宿主可采用一下几种形式:
       1、专用的WINDOWS服务器程序,服务器打开时自动启动,不需要用户干预。
       2、控制台应用程序,能够在屏幕上显示简单的诊断和日志信息。
       3、完成的WINDOWS应用程序,能够提供更为复杂的接口。

    NET远程处理的决策

     1、激活模式
      单调用SingleCall:这些无状态对象是由调用方法创建的,持续时间也方法相同。客户端能够保存和使用同一引用,可是每次调用都会创建一个新的对象。
      客户端激活对象:这种对象与普通对象类似。它们能够保持状态,每个客户端接受到一个单独的实例。
      单独对象SingleTon:这种类型的对象具有状态并在客户端间共享状态。无论连接多少客户端,都只有一个远程对象实例。
      单调用为无状态连接,消耗资源比较少,很容易装载到群集服务器上;客户端激活具有状态,与普通类相似易于进行编程,但需要耗费的资源比较大。单独对象很难管理,由于大量的客户端同时调用方法,就可能产生并发错误。另外单独对象也是比较耗费服务器资源的。
     2、对象生存周期
      单 独对象和客户端激活对象都具有状态,其工作原理是:只允许一个对象存在一定的时间。如果需要存在更长的时间,则要有“人”更新约定时间。这个有“人”可以 是特定的约定发起者,客户端组件,或是远程组件本身。为了确保系统的长时间稳定性和可缩放性,一定要使用又较为保守的策略。
     3、服务器和客户端激活
       单调用和单独对象都是服务器激活对象(SAO)。生存期约定既应用于客户端激活对象,也应用于服务端激活对象。客户端激活与服务端激活的最大区别是:客户 端初始化时服务器激活对象并没有创建,需要使用时才真正的生成。如果是一个尚不存在的对象,将在第一次调用它的方法时在服务端创建对象。相反的,客户端激 活对象是在客户端初始化时被创建。因此,客户端的激活可以使用带参数的构造函数,而服务器端激活对象只能使用没有参数的构造函数初始化。
     4、通信
      实现远程处理最终决定是所使用的通信格式与传输方式。NET框架默认支持两个格式化器和两个信道。
      两个格式化器:
          二进制格式化器。二进制格式化器把数据序列化为压缩的、专用的NET格式。这个格式化器提供了最好的性能,但只能由NET应用程序使用。
          SOAP格式化器。SOAP格式化器把数据序列化为跨平台的、基于XML的、存文本的SOAP消息。因为其它平台上的客户端能够新建和发送SOAP消息,这种格式仪器被用来远程NET组件进行跨平台通信。SOAP格式要求消息占用空间较大,因而总体性能比较低。
      两个信道是:
          TCP信道。这个信道基于TCP协议进行连接。对内部网最为理想。
          HTTP信道。使用HTTP协议,在需要通过INTERNET进行通信时最为理想。

二、Remoting的配置文件
包含用于在远程处理应用程序配置文件中放置自定义设置的标记。
<system.runtime.remoting>  包含有关远程对象和信道的信息。
<application>  包含有关应用程序使用和公开的远程对象的信息。
<lifetime>  包含有关由此应用程序提供服务的所有客户端激活对象生存期的信息。其属性有:leaseTime 租约周期;sponsorshipTimeout 到器等待时间;renewOnCallTime 调用引起的租约延长时间;aseManagerPollTime;超时检测间隔时间
 
<channels>(实例)  包含应用程序用来与远程对象进行通信的信道。
 
<channel>(实例)  配置应用程序用来与远程对象进行通信的信道。属性如下:
      ref:指示客户端要注册以供使用的信道模板的 id。如果指定 ref 属性,则不需要指定 type 属性。NET Framework 远程处理提供三种信道实现:“http”、“tcp”和“ipc”。
      displayName:供 .NET Framework 配置工具用来创建此应用程序已注册的信道列表 
      type:指示信道的完整类型名和信道实现所在的程序集的名称。 
      port:指示一个合适的端口属性
      portName:指定服务器将公开的端口的名称。 
      useIpAddress:个布尔值(true 或 false),它指定是否使用发布 URL 中的 IP 地址,而不使用计算机名称。
      useIpAddress:指定用于当前信道的计算机名称的字符串。如果用于服务器信道,将重写 useIpAddress。
<serverProviders>(实例) 包含信道接收器提供程序,当在配置文件中的其他位置引用此信道模板时,这些提供程序将成为该模板的默认服务器端信道接收器调用链的一部分。
<provider>(实例)  包含要插入信道接收器链的信道接收器的信道接收器提供程序。
<formatter>(实例)  包含要插入信道接收器链的格式化程序接收器的信道接收器提供程序。
<clientProviders>(实例)  包含信道接收器提供程序,当在配置文件中的其他位置引用此信道模板时,这些提供程序将成为该模板的默认客户端信道接收器调用链的一部分。
<client>  包含应用程序使用的对象。
<wellknown>(客户端实例) 包含有关应用程序要使用的服务器激活(已知)对象的信息。
<activated>(客户端实例)  包含有关应用程序要使用的客户端激活对象的信息。
<service>  包含应用程序公开给其他应用程序域或上下文的对象。
<wellknown>(服务实例)  包含有关应用程序要发布的服务器激活(已知)对象的信息。属性如下:
           属性  说明  
           mode  必选的属性。指示对象是一个 Singleton 对象还是一个 SingleCall 对象。必须选择一个选项。有关详细信息,请参见激活。
           objectUrl 必选的属性。指定对象的统一资源标识符 (URI) 的终结点。
            t ype  必选的属性。指定对象的完整类型名和类型实现的程序集名称。如果包含程序集在全局程序集缓存中,则这包括版本、区域性和公钥信息。 
            displayName 可选的属性。由 .NET Framework 配置工具用来创建向此服务器注册要发布的服务器激活对象的列表。.NET Framework 远程处理系统不使用此属性。
<activated>(服务实例)  包含有关应用程序要发布的客户端激活对象的信息。属性如下:
            type 指定对象的完整类型名和包含该类型实现的程序集的名称。如果包含程序集在全局程序集缓存中,则这包括版本、区域性和公钥信息。
<soapInterop>  包含与 SOAP 一起使用的类型映射。
<interopXmlType>  创建公共语言运行库类型与 XML 类型及 XML 命名空间之间的双向映射。
             属性  说明  
             clr  必选的属性。指定要为其创建到 XML 类型及 XML 命名空间的映射的类型的完整类型名和程序集名。如果包含程序集在全局程序集缓存中,则这包括版本、区域性和公钥信息。
             xml  必选的属性。指定要为其创建到类型和程序集的映射的 XML 类型名及 XML 类型命名空间。
<interopXmlElement>  创建公共语言运行库类型与 XML 元素及 XML 命名空间之间的双向映射。
             属性  说明  
             clr  必选的属性。指定要为其创建到 XML 元素及 XML 命名空间的映射的类型的完整类型名和程序集名。如果包含程序集在全局程序集缓存中,则这包括版本、区域性和公钥信息。
             xml  必选的属性。指定要为其创建到类型和程序集的映射的 XML 元素及 XML 命名空间。 
<preLoad>  指定要从扩展 SoapAttribute 的类中加载映射的类型。
             属性  说明  
             type  指定为启用反序列化而预加载的类型。如果包含程序集在全局程序集缓存中,则这包括版本、区域性和公钥信息。
             assembly 预加载指定程序集中的所有类型。
<channels>(模板)  包含应用程序用来与远程对象进行通信的信道模板。
<channel>(模板)  包含某信道模板,应用程序可指定并配置该信道模板,以便与远程对象进行通信或侦听对远程对象的请求。
             属性   说明  
            customChannelProperty 可选的属性。指示支持的自定义信道属性。可以指定信道能支持的任意数量的信道属性。应使用属性/值对指定自定义信道属性。
            delayLoadAsClientChannel 可选的属性。指示如果客户端没有为应用程序注册信道,是否应加载此信道。此值为布尔型,并且只影响客户端行为。值为 true 指示 .NET Framework 远程处理应在运行时测试此信道,以查看它是否支持使用在远程激活 URL 中指定的特定协议方案建立客户端连接。如果此值不存在,则默认值为 false。
            displayName  可选的属性。由 .NET Framework 配置工具用来创建此应用程序使用的信道列表。.NET Framework 远程处理系统不使用此属性。
            id   必选的属性。提供应用程序用来在注册时标识信道的字符串。若要引用此信道模板,请将此属性指定为实例信道元素中 ref 属性的值。
<channelSinkProviders> 包含客户端和服务器信道接收器提供程序的模板。在可能注册信道接收器提供程序的任何地方都可以引用此元素下指定的任何信道接收器提供程序。
<serverProviders>(模板)  包含可插入服务器信道调用链中的信道接收器模板。
<provider>(模板)  包含信道接收器的信道接收器提供程序模板,该信道接收器将插入服务器或客户端信道接收器链中。 
<formatter>(模板)  包含格式化程序接收器的信道接收器提供程序,该格式化程序接收器将插入客户端或服务器信道接收器链中。
  <formatter 
    id="FormatterID"
    type="FormatterSinkProviderType, FormatterAssembly"
    customFormatterProperty="customProperty"
    includeVersions="true"
    strictBinding="false"
 ...typeFilterLevel="Low | Full"
 />
            属性  说明  
           customFormatterProperty  指示支持的自定义信道接收器属性。可以指定自定义信道接收器提供程序及其接收器能支持的任意数量的提供程序和信道接收器属性。应使用属性/值对指定自定义信道接收器属性。
includeVersions 指示在序列化类型信息时,发送格式化程序包含完整的类型和程序集版本信息。有关重要的详细信息,请参见下面的备注部分。系统提供的两个格式化程序的默认值都是 true。
           strictBinding 指示在仅使用类型名称和程序集名称(无版本信息)之前,接收格式化程序首先试着使用完整的版本信息(如果有的话)来标识类型。有关重要的详细信息,请参见下面的备注部分。系统提供的两个格式化程序的默认值都是 false。
           typeFilterLevel 一个字符串值,它指定服务器通道接收器链中的格式化程序尝试的自动反序列化的级别。支持的值为 Low(默认值)和 Full。限 .NET Framework 1.1 版
           id  指定标识此格式化程序接收器提供程序的字符串。其他人可以在自己的 ref 属性中使用此字符串,以绑定到此格式化程序接收器提供程序。
           type  指定格式化程序接收器提供程序的完整类型名以及包含该提供程序实现的程序集的名称。如果包含程序集在全局程序集缓存中,则这包括版本、区域性和公钥信息。
<clientProviders>(模板)  包含可插入客户端信道调用链中的信道接收器模板。
<debug>  指定当应用程序启动时是否加载配置文件中的类型。
            属性  说明  
            loadTypes 必选的属性。指定当应用程序启动时是否加载在此配置文件中指定的所有类型,以便在配置文件中存在错误时可以得到警告。这有助于防止简单的键入错误占用太多的调试时间。 
<customErrors>  指示此应用程序域中的服务器通道是否将经筛选的或完整的异常信息返回给本地或远程调用方。
 <customErrors  mode="Off|On|RemoteOnly"/>

示例代码

客户的配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<appSettings>
    
<add key="CallType" value="1"/>
    
<add key="CallURL" value="http://127.0.0.1:8080/" />
    
<add key="DllName" value="DAL.DLL"/>
  
</appSettings>
  
<system.runtime.remoting>
    
<application>

      
<client url="tcp://127.0.0.1:8081/">
       
<!-- <wellknown type="DAL.DOrder,DAL"   url="http://127.0.0.1:8080/DOrder"/>
        <wellknown type="DAL.DShopCart,DAL" displayName="DShopCart2" url="http://127.0.0.1:8080/DShopCart" />
-->
        
        
<activated type="DAL.DShopCart,DAL" />
      
</client>
      
<channels>
          
<serverProviders>
            
<provider ref="wsdl" />
            
<formatter ref="soap" typeFilterLevel="Full" />
            
<formatter ref="binary" typeFilterLevel="Full" />
          
</serverProviders>
        
<channel ref="http" port="8083"/>
        
<channel ref="tcp" port="8082"/>
      
</channels>
    
</application>
  
</system.runtime.remoting>
</configuration>


服务端的配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<system.runtime.remoting>
    
<application name="服务终端">
      
<lifetime leaseTime="120S" sponsorshipTimeout="5S" renewOnCallTime="50S" leaseManagerPollTime="2S" />
      
<service>
        
<activated type="DAL.DShopCart,DAL"/>
        
<wellknown type="DAL.DOrder,DAL" objectUri="DAL.DOrder" mode="SingleCall" />
        
<wellknown type="DAL.DShopCart,DAL" objectUri="DShopCart" mode="SingleCall" />
        
<wellknown type="DAL.DShopCart,DAL" objectUri="DShopCart2" mode="Singleton" />
        
      
</service>
      
<channels>
        
<channel port="8080" ref="http"/>
        
<channel port="8081" ref="TCP"/>
        
<serverProviders>
          
<provider ref="wsdl" />
          
<formatter ref="soap" />
          
<formatter ref="binary"/>
        
</serverProviders>
      
</channels>
    
</application>
    
<debug loadTypes="true"/>
  
</system.runtime.remoting>
</configuration>
三、Remoting编程示例代码下载
    下载
posted on 2007-10-31 21:49  ymz  阅读(456)  评论(0编辑  收藏  举报