このサンプルは、「トランスポート: UDP」のサンプルに基づいています。ここでは トランスポート: UDP のサンプルを拡張し、Windows プロセス アクティブ化サービス (WAS) を使用してプロセスのアクティベーションをサポートするようにします。
サンプルは、次の 3 つの主要素で構成されます。
UDP プロトコル アクティベータ。アクティベーション対象のアプリケーションの代わりに UDP メッセージを受信するスタンドアロンのプロセスです。
UDP カスタム トランスポートを使用してメッセージを送信するクライアント。
UDP カスタム トランスポート経由でメッセージを受信するサービス。WAS によってアクティブ化されるワーカー プロセス内でホストされています。
UDP プロトコル アクティベータ
UDP プロトコル アクティベータは、WCF クライアントと WCF サービス間のブリッジです。トランスポート層で UDP プロトコルを介するデータ通信を実現します。主な機能は、次の 2 つです。
WAS リスナ アダプタ (LA)。WAS と連携し、受信メッセージに応答してプロセスをアクティブ化します。
UDP プロトコル リスナ。アクティベーション対象のアプリケーションの代わりに UDP メッセージを受け入れます。
このアクティベータは、サーバー コンピュータ上でスタンドアロン プログラムとして実行される必要があります。通常、WAS リスナ アダプタ (NetTcpActivator や NetPipeActivator など) は、長時間にわたって実行される Windows サービスに実装されます。ただしこのサンプルでは、単純化してわかりやすくするために、このプロトコル アクティベータをスタンドアロン アプリケーションとして実装しています。
WAS リスナ アダプタ
UDP の WAS リスナ アダプタは UdpListenerAdapter
クラスに実装されています。これは WAS とやり取りするモジュールで、UDP プロトコル用アプリケーションのアクティベーションを実行します。これは、次の Webhost API を呼び出すことによって実行されます。
WebhostRegisterProtocol
WebhostUnregisterProtocol
WebhostOpenListenerChannelInstance
WebhostCloseAllListenerChannelInstances
このリスナ アダプタは、WebhostRegisterProtocol を最初に呼び出した後、applicationHost.config (%windir%\system32\inetsrv 内にあります) に登録されているすべてのアプリケーションの WAS からコールバック ApplicationCreated を受信します。このサンプルで処理するのは、(プロトコル ID が "net.udp" の) UDP プロトコルが有効なアプリケーションだけです。他の実装でこのアプリケーションへの動的な構成変更 (アプリケーションを無効から有効に移行する場合など) に応答する場合、そうした実装では異なる方法でアプリケーションを処理することがあります。
コールバック ConfigManagerInitializationCompleted が受信される場合、WAS により、プロトコルの初期化に関するすべての通知が完了したことを示します。その時点で、リスナ アダプタはアクティベーション要求を処理する準備ができています。
アプリケーションに初めて新しい要求が届くと、このリスナ アダプタは WebhostOpenListenerChannelInstance を WAS に呼び出します。ワーカー プロセスがまだ開始されていない場合は、これにより開始されます。次に、プロトコル ハンドラが読み込まれ、リスナ アダプタと仮想アプリケーション間の通信を開始できるようになります。
このリスナ アダプタは、次のように <listenerAdapters> セクションの %SystemRoot%\System32\inetsrv\ApplicationHost.config に登録されています。
<add name="net.udp" identity="S-1-5-21-2127521184-1604012920-1887927527-387045" />
プロトコル リスナ
UDP プロトコル リスナはプロトコル アクティベータ内部のモジュールで、仮想アプリケーションの代わりに UDP エンドポイントでリッスンします。これは UdpSocketListener クラスに実装されています。エンドポイントは IPEndpoint として表され、このポート番号はサイトのプロトコルのバインディングから抽出されます。
サービスの制御
このサンプルでは、WCF を使用してアクティベータと WAS ワーカー プロセス間で通信を行います。アクティベータに存在するサービスは、コントロール サービスと呼ばれます。
プロトコル ハンドラ
リスナ アダプタが WebhostOpenListenerChannelInstance を呼び出した後、ワーカー プロセスが開始されていない場合は WAS プロセス マネージャによって開始されます。ワーカー プロセス内部のアプリケーション マネージャは、UDP プロセス プロトコル ハンドラ (PPH) を読み込み、ListenerChannelId を要求します。次に、PPH は IAdphManager.StartAppDomainProtocolListenerChannel を呼び出して、UDP AppDomain プロトコル ハンドラ (ADPH) を開始します。
HostedUDPTransportConfiguration
この情報は、Web.config で次のように登録されます。
<serviceHostingEnvironment>
<add name="net.udp" transportConfigurationType="Microsoft.ServiceModel.Samples.Hosting.HostedUdpTransportConfiguration, UdpActivation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=6fa904d2da1848d6" />
</serviceHostingEnvironment>
サンプルの使用方法
コンパイル後、次の 4 つの異なるバイナリが生成されます。
Client.exe: クライアント コード。App.config は、クライアント構成ファイルの Client.exe.config にコンパイルされます。
UDPActivation.dll: 主要なすべての UDP 実装を含むライブラリ。
Service.dll: サービス コード。これは、ServiceModelSamples 仮想アプリケーションの \bin ディレクトリにコピーされます。このサービス ファイルは Service.svc で、構成ファイルは Web.config です。これらをコンパイルすると、%SystemDrive%\Inetpub\wwwroot\ServiceModelSamples にコピーされます。
WasNetActivator: UDP アクティベータ プログラム。
必要なすべての要素が正しくインストールされていることを確認します。サンプルを実行する方法を、次の手順に示します。
次の Windows サービスが開始されていることを確認します。
Windows プロセス アクティブ化サービス (WAS)。
インターネット インフォメーション サービス (IIS): W3SVC。
次に、アクティベータ WasNetActivator.exe を起動します。[アクティブ化] タブのボックスの一覧から、唯一のプロトコルである [UDP] を選択します。[開始] をクリックして、アクティベータを開始します。
アクティベータが開始されると、コマンド ウィンドウで Client.exe を実行することにより、クライアント コードを実行できます。このサンプルの出力は、次のようになります。
Testing Udp Activation. Start the status service. Sending UDP datagrams. Type a word that you want to say to the server: Hello, world! Sending datagram: Hello, world![0] Sending datagram: Hello, world![1] Sending datagram: Hello, world![2] Sending datagram: Hello, world![3] Sending datagram: Hello, world![4] Calling UDP duplex contract (ICalculatorContract). 0 + 0 = 0 1 + 2 = 3 2 + 4 = 6 3 + 6 = 9 4 + 8 = 12 Getting status and dump server traces: Operation 'Hello' is called: Hello, world![0] Operation 'Hello' is called: Hello, world![1] Operation 'Hello' is called: Hello, world![2] Operation 'Hello' is called: Hello, world![3] Operation 'Hello' is called: Hello, world![4] Operation 'Add' is called: 0 + 0 Operation 'Add' is called: 1 + 2 Operation 'Add' is called: 2 + 4 Operation 'Add' is called: 3 + 6 Operation 'Add' is called: 4 + 8 Press <ENTER> to complete test.
このサンプルの特殊なセットアップ
このサンプルは、Windows Vista でのみビルドおよび実行可能です。サンプルを実行するには、最初にすべてのコンポーネントを正しくセットアップする必要があります。サンプルをインストールするには、次の手順に従います。
Windows Vista でプロジェクトをビルドします。コンパイル後、ビルド後のフェーズで次の操作を実行します。
UDP バインディングを [既定の Web サイト] のサイトにインストールします。
物理パス "%SystemDrive%\inetpub\wwwroot\servicemodelsamples" をポイントする、仮想アプリケーション "ServiceModelSamples" を作成します。
さらに、この仮想アプリケーションの "net.udp" プロトコルを有効にします。
ユーザー インターフェイス アプリケーション "WasNetActivator.exe" を起動します。[セットアップ] タブをクリックして次のチェック ボックスをオンにし、[インストール] をクリックしてこれらをインストールします。
UDP リスナ アダプタ
UDP プロトコル ハンドラ
ユーザー インターフェイス アプリケーション "WasNetActivator.exe" の [アクティブ化] タブをクリックします。[開始] をクリックして、リスナ アダプタを開始します。これで、プログラムを実行する準備ができました。
メモ :
このサンプルの実行後は、Cleanup.bat を実行して、[既定の Web サイト] から net.udp バインディングを削除する必要があります。
Copyright © 2007 by Microsoft Corporation.All rights reserved.