Microsoft .NET リモート処理フレームワークの概要

 

水田スリニヴァサン
Microsoft Corporation

概要: この記事では、Microsoft .NET Remoting Framework の基礎について説明します。 このドキュメントでは、.NET リモート処理フレームワークを構成するメイン コンポーネントについて説明するだけでなく、.NET リモート処理を使用して分散オブジェクトと通信できるさまざまなシナリオについて説明します。 (11ページ印刷)

メモ この記事には、更新されたベータ 2 コードが含まれています。

内容

はじめに
.NET リモート処理オブジェクト
.NET リモート処理オブジェクトのホスト
.NET リモート処理メタデータと構成ファイル
.NET リモート処理のシナリオ
まとめ
もっと読む

はじめに

Microsoft® .NET Remoting は、異なる AppDomains、異なるプロセス、および異なるマシンに住むオブジェクトがシームレスに通信するための、豊富で拡張可能なフレームワークを提供します。 .NET リモート処理では、これらの対話を透過的にするための強力でシンプルなプログラミング モデルとランタイム サポートが提供されます。 この記事では、リモート処理アーキテクチャのさまざまな構成要素を見て、.NET リモート処理を利用できる一般的なシナリオをいくつか説明します。 .NET リモート処理の概要については、まず 「Microsoft .NET リモート処理: 技術的な概要」の記事を参照してください。

.NET リモート処理オブジェクト

.NET リモート オブジェクトとして機能するように構成できるオブジェクトには、3 つの種類があります。 アプリケーションの要件に応じて、オブジェクトの種類を選択できます。 このセクションでは、次のオブジェクトについて詳しく説明します。

  • 1 回の呼び出し
    単一呼び出しオブジェクトは、1 つの要求のみを受け入れるサービスを提供します。 単一呼び出しオブジェクトは、オブジェクトが有限の作業を行う必要があるシナリオで役立ちます。 通常、単一呼び出しオブジェクトは状態情報を格納するために必要ではなく、メソッド呼び出し間で状態情報を保持することはできません。 ただし、単一呼び出しオブジェクトは負荷分散された方法で構成できます。
  • **シングルトン オブジェクト
    **Singleton オブジェクトは、複数のクライアントにサービスを提供し、クライアント呼び出し間で状態情報を格納することによってデータを共有するオブジェクトです。 これらは、クライアント間でデータを明示的に共有する必要がある場合や、オブジェクトの作成と保守のオーバーヘッドが大きい場合に便利です。
  • **クライアントでアクティブ化されたオブジェクト (CAO)
    **クライアントアクティブ化オブジェクト (CAO) は、クライアントからの要求に応じてアクティブ化されるサーバー側オブジェクトです。 サーバー オブジェクトをアクティブ化するこの方法は、従来の COM コクラスアクティブ化とよく似ています。 クライアントが "new" 演算子を使用してサーバー オブジェクトの要求を送信すると、アクティブ化要求メッセージがリモート アプリケーションに送信されます。 その後、サーバーは要求されたクラスのインスタンスを作成し、それを呼び出したクライアント アプリケーションに ObjRef を返します。 その後、ObjRef を使用してクライアント側にプロキシが作成されます。 クライアントのメソッド呼び出しはプロキシで実行されます。 クライアントでアクティブ化されたオブジェクトは、異なるクライアント オブジェクト間ではなく、その特定のクライアントのメソッド呼び出しの間に状態情報を格納できます。 "new" を呼び出すたびに、サーバーの種類の独立したインスタンスにプロキシが返されます。

.NET リモート処理を使用してオブジェクトを渡す

.NET リモート処理では、次の方法でオブジェクトを 1 つのアプリケーションから別のアプリケーションに渡すことができます。

  1. メソッド呼び出しのパラメーターとして

    例: public int myRemoteMethod(MyRemoteObject myObj)

  2. メソッド呼び出しの戻り値

    例: public MyRemoteObjectmyRemoteMethod(String myString)

  3. .NET コンポーネントのプロパティまたはフィールド アクセスの結果の値

    例:myObj.myNestedObject

値によるマーシャリング (MBV) のオブジェクトの場合、オブジェクトがアプリケーション間で渡されるときに、オブジェクトの完全なコピーが作成されます。

参照によるマーシャリング (MBR) オブジェクトの場合、あるアプリケーションから別のアプリケーションに渡されると、オブジェクトへの参照が作成されます。 オブジェクト参照 (ObjRef) がリモート アプリケーションに到着すると、元のオブジェクトへの "プロキシ" に戻されます。

単純な .NET リモート処理サーバー オブジェクトのサンプル コード

using System;
using System.Runtime.Remoting;
namespace myRemoteService
{
    // Well Known Web Service object
    public class myRemoteObject : MarshalByRefObject
    {
        // Method myRemoteMethod
        public String myRemoteMethod(String s) 
        {
         return "Hello World";
        }
    }
}

このオブジェクトにアクセスするためのサンプル クライアント コード

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using myRemoteService;
public class Client
{
    public static int Main(string[] args)
    {
        ChannelServices.RegisterChannel(new HttpChannel());
      // Create an instance of a myRemoteObject class 
   myRemoteObject myObj = ( myRemoteObject)Activator.GetObject(typeof(myRemoteObject),
            "http://myHost:7021/host/myRemoteObject.soap");
      myObj. myRemoteMethod ("Hello World");
        return 0;
    }
}

リースベースの有効期間

アプリケーションの外部で転送されるオブジェクト参照を持つオブジェクトの場合は、リースが作成されます。 リースにはリース時間があります。リースが 0 に達すると、有効期限が切れ、オブジェクトが .NET リモート処理フレームワークから切断されます。 AppDomain 内のオブジェクトへのすべての参照が解放されると、次のガベージ コレクションが発生したときにオブジェクトが収集されます。 リースは、オブジェクトの有効期間を制御します。

オブジェクトには既定のリース期間がありますが、クライアントが同じサーバー オブジェクトで状態を維持する場合に備えて、オブジェクトを維持するためにリース期間を延長する方法は多数あります。

  1. サーバー オブジェクトはリース時間を無限大に設定できます。これにより、ガベージ コレクション サイクル中にリモート処理で収集しないように指示されます。
  2. クライアントは RemotingServices.GetLifetimeService メソッドを呼び出して、AppDomain のリース マネージャーからサーバー オブジェクトのリースを取得できます。 リース オブジェクトから、クライアントは Lease.Renew メソッドを呼び出してリースを拡張できます。
  3. クライアントは、特定のリースのスポンサーを AppDomain のリース マネージャーに登録できます。 リモート オブジェクトのリースの有効期限が切れると、リース マネージャーはスポンサーに電話をかけ直してリースの更新を要求します。
  4. ILease::RenewOnCallTime プロパティが設定されている場合、リモート オブジェクトを呼び出すたびに、RenewOnCallTime プロパティで指定された時間だけリースが更新されます。
  単一呼び出し/シングルトン オブジェクト クライアント側でアクティブ化されるオブジェクト
クライアント側のアクティブ化コード (クライアント側でコードが必要)

詳細については、構成ファイルに関するセクションを参照してください

a) Activator.GetObject()

b) new() with CFG file

クライアントの CFG ファイルは URL を参照します。

Foo= https://localhost:80/ObjectZone/Foo.soap

a) Activator.CreateInstance()

b) new() with CFG file

クライアントの CFG ファイルが URL を参照しています。 次に例を示します。


https://localhost:80/ObjectZone

サーバー オブジェクトのアクティブ化 最初のメソッド呼び出しが行われるまで、アクティブ化メッセージはネットワーク経由で送信されません。 クライアントがオブジェクトを作成し、クライアント側でプロキシを作成すると、アクティブ化メッセージがサーバー コンピューターに送信されます。 パラメーターを持つコンストラクターがサポートされています。
サーバー オブジェクトの有効期間 有効期間は、サーバー上の構成によって決まります。 SingleCall または Singleton のいずれかです。 シングルトン オブジェクトも有効期間管理の対象となります。 有効期間は、次の 2 つのイベントの早い段階です。

a) リースの有効期限が切れる

b) クライアントがサーバー オブジェクトの参照を失った場合

サーバー側の登録 a) 構成ファイルを使用して型 (SingleCall または Singleton) を指定します。

b) RegisterWellKnownServiceType() api を使用して型を登録します。

構成ファイルを使用して、クライアントでアクティブ化されたオブジェクトをエクスポートします。

詳細については、構成ファイルに関するセクションを参照してください

モデルの利点 a) クライアントは、サーバー コンポーネントの基本クラスまたはインターフェイス定義の共通言語ランタイム メタデータに対してコンパイルできます。

b) サーバー側で有限の操作を実行するのに役立ちます。

c) 単一呼び出しオブジェクトは、状態を保持しないため、負荷分散システムに簡単にデプロイできます。

d) シングルトン オブジェクトは、クライアント オブジェクト間で状態情報を保持できます。

a) サーバー オブジェクトの呼び出しのような従来の COM "コクラス"。

b) クライアントは、サーバー オブジェクトの有効期間をより柔軟に管理できます。

c) クライアントは、作成されたオブジェクトにコンストラクター パラメーターを渡すことができます。

d) サーバー オブジェクトは、メソッド呼び出しの間に特定のクライアントの状態を保持できます。

.NET リモート処理オブジェクトのホスト

.NET リモート処理オブジェクトは、次の中でホストできます。

  1. **マネージド実行可能ファイル
    **NET リモート処理オブジェクトは、通常の .NET EXE またはマネージド サービスでホストできます。

  2. **Iis
    **リモート処理オブジェクトは、インターネット インフォメーション サーバー (IIS) でホストできます。 既定では、IIS でホストされているリモート処理オブジェクトは、HTTP チャネルを介してメッセージを受信します。 IIS でリモート処理オブジェクトをホストするには、仮想ルートを作成し、"remoting.config" ファイルをコピーする必要があります。 リモート オブジェクトを含む実行可能ファイルまたは DLL は、IIS ルートが指すディレクトリの下の bin ディレクトリに配置する必要があります。 IIS ルート名は、構成ファイルで指定されたアプリケーション名と同じである必要があることに注意してください。 リモート処理構成ファイルは、最初のメッセージがアプリケーションに到着すると自動的に読み込まれます。 これにより、.NET リモート処理オブジェクトを Web サービスとして公開できます。

    Remoting.cfg ファイルのサンプル:

    <configuration>
      <system.runtime.remoting>
        <application name="RemotingHello">
    
          <service>
            <wellknown mode="SingleCall" 
                       type="Hello.HelloService, Hello" 
                       objectUri="HelloService.soap" />
          </service>
    
          <channels>
            <channel port="8000" 
    type="System.Runtime.Remoting.Channels.Http.HttpChannel, 
    System.Runtime.Remoting" />
          </channels>
    
        </application>
      </system.runtime.remoting>
    </configuration>
    
  3. **.NET コンポーネント サービス
    **NET リモート処理オブジェクトは、トランザクション、JIT、オブジェクト プールなどのさまざまな COM+ サービスを利用するために、.NET コンポーネント サービス インフラストラクチャでホストできます。

    詳細については、「Microsoft .NET Framework コンポーネント サービス、パート 1」を参照してください。

Channel Services (System.Runtime.Remoting.Channels)

.NET アプリケーションと AppDomains は、メッセージを使用して相互に通信します。 .NET Channel Services は、この通信の基になるトランスポート メカニズムを提供します。

.NET Frameworkは HTTP チャネルと TCP チャネルを提供しますが、サード パーティは独自のチャネルを書き込んでプラグインできます。 HTTP チャネルは既定で SOAP を使用して通信しますが、TCP チャネルでは既定でバイナリ ペイロードが使用されます。

チャネル サービスは、異種アプリケーションを統合するために記述できるカスタム チャネルを使用してプラグ可能です (IChannel を使用)。

チャネル サービスを読み込むサンプル コード

public class myRemotingObj
{
    HttpChannel httpChannel;
    TcpChannel tcpChannel;
    public void myRemotingMethod()
    {
httpChannel =  new HttpChannel();
tcpChannel  =  new TcpChannel();
        ChannelServices.RegisterChannel(httpChannel);
// Register the HTTP Channel 
        ChannelServices.RegisterChannel(tcpChannel);
// Register the TCP Channel  


    }
} 

シリアル化フォーマッタ (System.Runtime.Serialization.Formatters)

.NET シリアル化フォーマッタは、.NET アプリケーションと AppDomains の間でメッセージをエンコードおよびデコードします。 .NET ランタイムには、Binary(System.Runtime.Serialization.Formatters.Binary) と SOAP (System.Runtime.Serialization.Formatters.Soap) という 2 つのネイティブ フォーマッタがあります。

シリアル化フォーマッタは、IRemotingFormatter インターフェイスを実装し、上記のチャネルに接続することでプラグ可能です。 このプロセスは、このドキュメントの後のセクションで説明しますが、アプリケーションに最適なチャネルとフォーマッタの組み合わせを柔軟に選択できます。

例: バイナリ データをシリアル化するバイナリ フォーマッタを使用する HTTP チャネルと、SOAP 書式設定を使用した TCP チャネルを使用できます。

リモート処理コンテキスト

コンテキストは、共通のランタイム プロパティを共有するオブジェクトを含む境界です。 コンテキスト属性の例としては、同期とスレッド アフィニティがあります。 .NET オブジェクトがアクティブ化されると、ランタイムは現在のコンテキストに互換性があるかどうかを確認し、互換性がない場合は、新しいコンテキストが作成されます。 1 つのコンテキストで複数のオブジェクトを同時に実行でき、AppDomain には複数のコンテキストを含めることができます。

あるコンテキスト内のオブジェクトから別のコンテキスト内のオブジェクトへの呼び出しは、コンテキスト プロキシを経由し、組み合わせたコンテキスト プロパティによって適用されるポリシーの影響を受けます。 新しいオブジェクトのコンテキストは、通常、 クラスのメタデータ属性に基づいて選択されます。

コンテキストにバインドされるクラスは、コンテキスト バインド クラスと呼ばれます。 コンテキスト バインド クラスは、コンテキスト属性と呼ばれる特殊なカスタム 属性を使用して属性付けできます。 コンテキスト属性は完全に拡張可能であり、これらの属性を作成してクラスにアタッチできます。 コンテキストにバインドされているオブジェクトは、 System.ContextBoundObject から派生します。

.NET リモート処理メタデータと構成ファイル

Metadata

.NET Frameworkでは、メタデータとアセンブリを使用してコンポーネントに関する情報を格納し、言語間プログラミングを可能にします。 .NET リモート処理では、メタデータを使用してプロキシ オブジェクトを動的に作成します。 クライアント側で作成されるプロキシ オブジェクトには、元のクラスと同じメンバーがあります。 ただし、プロキシ オブジェクトの実装では、.NET リモート処理ランタイムを通じてすべての要求が元のオブジェクトに転送されます。 シリアル化フォーマッタはメタデータを使用して、メソッド呼び出しをペイロード ストリームに変換して戻します。

クライアントは、次の方法でリモート オブジェクトにアクセスするために必要なメタデータ情報を取得できます。

  1. サーバー オブジェクトの .NET アセンブリ — サーバー オブジェクトは、メタデータ アセンブリを作成してクライアントに配布できます。 クライアント オブジェクトは、クライアント オブジェクトのコンパイル中にアセンブリを参照できます。 これは、クライアントとサーバーがマネージド コンポーネントである閉じたシナリオで非常に便利です。
  2. リモート処理オブジェクトは、オブジェクトとそのメソッドを記述する WSDL (Web サービス記述言語 (WSDL) 1.1 を参照) ファイルを提供できます。 WSDL ファイルに対応する SOAP 要求を読み取って生成できるクライアントは、このオブジェクトを呼び出し、SOAP を使用して通信できます。 .NET リモート処理サーバー オブジェクトは、.NET SDK に付属する SOAPSUDS.EXE ツールを使用して、メタデータとして機能する WSDL ファイルを生成できます。 これは、organizationが任意のクライアントがアクセスして使用できるパブリック サービスを提供する場合に便利です。
  3. .NET クライアントは、SOAPSUDS ユーティリティを使用して、(サーバー上で生成された) サーバーから XML スキーマをダウンロードして、ソース ファイルまたはメタデータのみを含み、コードを含まないアセンブリを生成できます。 必要に応じて、ソース ファイルをクライアント アプリケーションにコンパイルできます。 このメソッドは、ある層のオブジェクトが別の層のリモート オブジェクトにアクセスする多層アプリケーションで役立ちます。

構成ファイル

構成ファイル (.config ファイル) は、特定のオブジェクトのさまざまなリモート処理固有の情報を指定するために使用されます。 通常、各 AppDomain には独自の構成ファイルがあります。 構成ファイルを使用すると、場所の透明性を実現するのに役立ちます。 構成ファイルで指定された詳細は、プログラムで実行することもできます。 構成ファイルを使用するメイン利点は、ソース ファイルの編集と再コンパイルではなく、構成ファイルを変更するだけで将来の変更を行えるように、クライアント コードに対して透過的な構成情報を分離することです。 構成ファイルは、.NET リモート処理クライアント オブジェクトとサーバー オブジェクトの両方で使用されます。

一般的な構成ファイルには、次のような情報が含まれます。

  1. ホスト アプリケーション情報
  2. オブジェクトの名前
  3. オブジェクトの URI
  4. 登録されているチャネル (複数のチャネルを同時に登録できます)
  5. サーバー オブジェクトのリース時間情報

構成ファイルの例を次に示します (この形式は今後のリリースで XML に変更される可能性があることに注意してください)。

<configuration>
  <system.runtime.remoting>
    <application name="HelloNew">

      <lifetime leaseTime="20ms" sponsorshipTimeout="20ms" 
renewOnCallTime="20ms" />  

      <client url="https://localhost:8000/RemotingHello">
        <wellknown type="Hello.HelloService, MyHello" 
      url="https://localhost:8000/RemotingHello/HelloService.soap" />
        <activated type="Hello.AddService, MyHello"/>
      </client>
      
      <channels>
        <channel port="8001" 
      type="System.Runtime.Remoting.Channels.Http.HttpChannel, 
      System.Runtime.Remoting" />
      </channels>
      
    </application>
  </system.runtime.remoting>
</configuration>

.NET リモート処理のシナリオ

.NET リモート処理のしくみを理解したので、さまざまなシナリオを見て、それぞれのシナリオで .NET リモート処理を最適に使用する方法を調べてみましょう。 次の表に、クライアントとサーバーの組み合わせと、既定で使用される基になるプロトコルとペイロードの一覧を示します。 .NET Remoting Framework は拡張可能であり、独自の通信チャネルとシリアル化フォーマッタを記述できる点に注意してください。

クライアント サーバー ペイロード Protocol
.NET コンポーネント .NET コンポーネント SOAP/XML http
.NET コンポーネント .NET コンポーネント Binary TCP
マネージド/アンマネージド .NET Web Services SOAP/XML http
.NET コンポーネント アンマネージ クラシック COM コンポーネント NDR (ネットワーク データ表現) DCOM
アンマネージド クラシック COM コンポーネント .NET コンポーネント Ndr DCOM

ANY Client <-> HTTP-SOAP を使用した .NET

Web サービスは、URL アドレス指定可能なリソースであり、使用するクライアントにプログラムによって情報を返します。 クライアントは、実装の詳細を気にせずに Web サービスを使用できます。 Web サービスは、Web サービス記述言語 (WSDL) ファイルを使用して記述されるコントラクトと呼ばれる適切に定義されたインターフェイスを使用します。 WSDL の詳細については、「Web サービス記述言語 (WSDL) 1.0」を参照してください。

.NET リモート処理オブジェクトは、IIS でホストすることで Web サービスとして公開できます。 WSDL ファイルを使用できるクライアントは、WSDL ファイルで指定されたコントラクトに従って、リモート オブジェクトに対して SOAP 呼び出しを行うことができます。 IIS は、ISAPI 拡張機能を使用して適切なオブジェクトに要求をルーティングします。 したがって、リモート処理オブジェクトは Web サービス オブジェクトとして機能し、豊富な.NET Frameworkインフラストラクチャを活用できます。 この構成は、さまざまなプラットフォームまたは環境のプログラムからオブジェクトにアクセスする場合に便利です。 Web サービスの詳細については、「プログラミング可能な Web: Web サービスは Microsoft .NET Frameworkの構成要素を提供する」を参照してください。 この構成により、クライアントはファイアウォール経由で .NET オブジェクトに簡単にアクセスできます。

図 1. HTTP-SOAP を介してリモート処理オブジェクトの Web サービスを呼び出すクライアントの例

SOAP-HTTP> チャネルを使用した .NET<-.NET

HTTP チャネルは既定で SOAP フォーマッタを使用するため、クライアントがインターネット経由でオブジェクトにアクセスするシナリオで使用できます。 この方法では HTTP を使用するため、ファイアウォールを介してリモートで .NET オブジェクトにアクセスすることは、この構成によって有効になります。 この方法で公開されるオブジェクトは、前のセクションで説明したように、IIS でこれらのオブジェクトをホストするだけで、Web サービス オブジェクトとして簡単に構成できます。 クライアントは、これらのオブジェクトの WSDL ファイルを読み取り、SOAP を使用してリモート オブジェクトと通信できます。

TCP チャネルを使用した .NET<->.NET

TCP チャネルでは、既定でバイナリ フォーマッタが使用されます。 このフォーマッタは、データをバイナリ形式でシリアル化し、生ソケットを使用してネットワーク経由でデータを送信します。 この方法は、オブジェクトがファイアウォールの範囲内で閉じられた環境にデプロイされている場合に最適です。 この方法は、ソケットを使用してオブジェクト間でバイナリ データを通信するため、より最適化されています。 TCP チャネルを使用してオブジェクトを公開すると、閉じた環境でのオーバーヘッドが少なくなります。 ファイアウォールと構成の問題のため、この方法をインターネット経由で使用することはできません。

図 2. TCP チャネルを使用してコンピューターの境界を越えてリモート処理オブジェクトを呼び出すクライアントの例

.NET <-> アンマネージド COM コンポーネント <-> .NET

COM 相互運用サービスを介してアンマネージ クラシック COM コンポーネントを呼び出す可能性があります。 .NET リモート処理クライアント オブジェクトが COM オブジェクトのインスタンスを作成すると、オブジェクトは、実際のアンマネージド オブジェクトのプロキシとして機能するランタイム呼び出し可能ラッパー (RCW) を介して公開されます。 これらのラッパーは、.NET クライアントの他のマネージド クラスと同じように見えますが、実際には、マネージド (.NET) コードとアンマネージド (COM) コードの間で呼び出しをマーシャリングするだけです。

同様に、.NET リモート処理サーバー オブジェクトを従来の COM クライアントに公開できます。 COM クライアントが .NET オブジェクトのインスタンスを作成すると、オブジェクトは、実際のマネージド オブジェクトのプロキシとして機能する COM 呼び出し可能ラッパー (CCW) を介して公開されます。

どちらのシナリオでも、通信に DCOM が使用されます。 この相互運用性は、クラシック COM と .NET コンポーネントが混在するシナリオで非常に便利です。

まとめ

Microsoft .NET Frameworkは、堅牢でスケーラブルな分散システムを開発するための、強力で拡張可能な言語に依存しないフレームワークを提供します。 .NET リモート処理フレームワークは、システムの要件に応じて、リモート操作を行う強力な方法を提供します。 .NET リモート処理は Web サービスとシームレスに統合され、複数のプラットフォーム間でアクセスするための .NET オブジェクトを公開する方法を提供します。

もっと読む