天天看點

Net 遠端處理基本知識

一、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>

服務端的配置檔案

    <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>

        <channel port="8080" ref="http"/>

        <channel port="8081" ref="TCP"/>

        <serverProviders>

          <provider ref="wsdl" />

          <formatter ref="soap" />

          <formatter ref="binary"/>

        </serverProviders>

    <debug loadTypes="true"/>

繼續閱讀