次の方法で共有


WCF でのキュー

このセクションでは、Windows Communication Foundation (WCF) でキューに入った通信を使用する方法について説明します。

WCF トランスポート バインディングとしてのキュー

WCF では、コントラクトは交換対象を指定します。 コントラクトは、ビジネス依存またはアプリケーション固有のメッセージ交換です。 メッセージの交換に使用されるメカニズム (または "how") は、バインディングで指定されます。 WCF のバインドは、メッセージ交換の詳細をカプセル化します。 ユーザーがトランスポートまたはバインディングが表すプロトコルのさまざまな側面を制御するための構成ノブを公開します。 WCF でのキューは、他のトランスポート バインドと同様に扱われます。これは、多くのキュー アプリケーションにとって大きな利点です。 現在、多くのキュー アプリケーションは、他のリモート プロシージャ コール (RPC) スタイルの分散アプリケーションとは異なる方法で記述されているため、フォローと保守が困難になっています。 WCF では、分散アプリケーションを記述するスタイルは大きく同じであるため、フォローと保守が容易になります。 さらに、ビジネス ロジックとは別に交換のメカニズムを考慮することで、トランスポートを構成したり、アプリケーション固有のコードに影響を与えずに変更を加えたりする方が簡単です。 次の図は、MSMQ をトランスポートとして使用する WCF サービスとクライアントの構造を示しています。

キューに登録されたアプリケーション ダイアグラム

前の図からわかるように、クライアントとサービスは、アプリケーション セマンティクス、つまりコントラクトと実装のみを定義する必要があります。 サービスは、優先設定を使用してキューに登録されたバインドを構成します。 クライアントは ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用して、サービスに対して WCF クライアントを生成し、サービスにメッセージを送信するために使用するバインドを記述する構成ファイルを生成します。 したがって、キューに置かれたメッセージを送信するために、クライアントは WCF クライアントをインスタンス化し、それに対して操作を呼び出します。 これにより、メッセージが伝送キューに送信され、ターゲット・キューに転送されます。 キューに入れられている通信の複雑さはすべて、メッセージの送受信を行うアプリケーションには表示されません。

WCF でのキューバインドに関する注意事項は次のとおりです。

  • WCF の既定のキューバインドではキューを使用した双方向通信がサポートされていないため、すべてのサービス操作は一方向である必要があります。 双方向通信サンプル (Two-Way Communication) は、2 つの一方向コントラクトを使用してキューを使用する双方向通信を実装する方法を示しています。

  • メタデータ交換を使用して WCF クライアントを生成するには、サービスに追加の HTTP エンドポイントが必要です。これを直接照会して WCF クライアントを生成し、バインディング情報を取得してキューに入れた通信を適切に構成できるようにします。

  • キューに置かれたバインドに基づいて、WCF の外部で追加の構成が必要です。 たとえば、WCF に付属する NetMsmqBinding クラスでは、バインディングを構成し、メッセージ キュー (MSMQ) を最小限に抑える必要があります。

次のセクションでは、MSMQ に基づく WCF に付属する特定のキューバインドについて説明します。

MSMQ (マイクロソフト メッセージキュー)

WCF のキューに登録されたトランスポートは、キューに入れた通信に MSMQ を使用します。

MSMQ は、Windows と共にオプションのコンポーネントとして出荷され、NT サービスとして実行されます。 転送キュー内の転送とターゲット キューでの配信のメッセージをキャプチャします。 MSMQ キュー・マネージャーは、メッセージが伝送で失われないように、信頼性の高いメッセージ転送プロトコルを実装します。 プロトコルは、SOAP Reliable Message Protocol (SRMP) など、ネイティブでも SOAP ベースでもかまいません。

MSMQ では、キューはトランザクションでも非トランザクションでもかまいません。 トランザクション キューを使用すると、メッセージをキャプチャしてトランザクションで配信し、キューに永続的に格納できます。 トランザクション キューに送信されたメッセージは、順番に 1 回だけ転送されます。 非トランザクション キューを使用して、揮発性メッセージと永続メッセージの両方を送信できます。 非トランザクション キューに送信されたメッセージには、信頼性の高い転送保証はありません。したがって、メッセージが失われる可能性があります。

MSMQ キューは、Active Directory ディレクトリ サービスに登録されている Windows ID を使用してセキュリティで保護することもできます。 MSMQ をインストールする場合は、Active Directory 統合をインストールできます。これには、コンピューターが Windows ドメイン ネットワークの一部である必要があります。

MSMQ の詳細については、「 メッセージ キュー (MSMQ) のインストール」を参照してください。

NetMsmqBinding

<netMsmqBinding> は、2 つの WCF エンドポイントが MSMQ を使用して通信するためのキューに登録されたバインディング WCF です。 したがって、バインディングは MSMQ に固有のプロパティを公開します。 ただし、すべての MSMQ の機能とプロパティが NetMsmqBindingで公開されるわけではありません。 コンパクトな NetMsmqBinding は、ほとんどのお客様が十分に見つける必要がある最適な機能セットで設計されています。

NetMsmqBindingは、バインディングのプロパティの形式でこれまでに説明したコア キューの概念を示しています。 これらのプロパティは、メッセージを転送して配信する方法を MSMQ と通信します。 プロパティ カテゴリについては、次のセクションで説明します。 詳細については、特定のプロパティについて詳しく説明する概念に関するトピックを参照してください。

ExactlyOnce プロパティと Durable プロパティ

ExactlyOnceプロパティとDurableプロパティは、キュー間でのメッセージの転送方法に影響します。

  • ExactlyOnce: true (既定値) に設定すると、キューに登録されたチャネルによって、配信された場合にメッセージが重複しないようにします。 また、メッセージが失われないようにします。 メッセージを配信できない場合、またはメッセージを配信する前にメッセージ Time-To Live が期限切れになった場合は、配信失敗の理由と共に失敗したメッセージが配信不能キューに記録されます。 falseに設定すると、キューに登録されたチャネルはメッセージを転送する作業を行います。 この場合は、必要に応じて配信不能キューを選択できます。

  • Durable: true (既定値) に設定すると、キューに登録されたチャネルにより、MSMQ によってメッセージがディスクに永続的に格納されます。 したがって、MSMQ サービスが停止して再起動した場合、ディスク上のメッセージはターゲット キューに転送されるか、サービスに配信されます。 falseに設定すると、メッセージは揮発性ストアに格納され、MSMQ サービスの停止と再起動時に失われます。

信頼できる転送 ExactlyOnce するため、MSMQ ではキューがトランザクションである必要があります。 また、MSMQ では、トランザクション キューから読み取るトランザクションが必要です。 そのため、 NetMsmqBindingを使用する場合は、 ExactlyOncetrue に設定されている場合、メッセージの送受信にトランザクションが必要であることを覚えておいてください。 同様に、MSMQ では、 ExactlyOncefalse されたときや揮発性メッセージングの場合など、ベスト エフォート保証のためにキューが非トランザクションである必要があります。 したがって、 ExactlyOncefalse に設定する場合、または永続的に false に設定する場合、トランザクションを使用して送受信することはできません。

バインドの設定に基づいて、正しいキュー (トランザクションまたは非トランザクション) が作成されていることを確認します。 ExactlyOncetrueされている場合は、トランザクション キューを使用します。それ以外の場合は、非トランザクション キューを使用します。

キューのプロパティの Dead-Letter

配信不能キューは、配信に失敗したメッセージを格納するために使用されます。 ユーザーは、配信不能キューからメッセージを読み取る補正ロジックを記述できます。

多くのキュー システムでは、システム全体の配信不能キューが提供されます。 MSMQ は、非トランザクション キューへの配信に失敗するメッセージに対してシステム全体の非トランザクション配信不能キューを提供し、トランザクション キューへの配信に失敗したメッセージのシステム全体のトランザクション配信不能キューを提供します。

異なるターゲット キューにメッセージを送信する複数のクライアントが MSMQ サービスを共有している場合、クライアントによって送信されるすべてのメッセージは同じ配信不能キューに送られます。 これは常に好ましいとは限りません。 分離を向上させるために、Windows Vista の WCF と MSMQ には、配信に失敗したメッセージを格納するためにユーザーが指定できるカスタム配信不能キュー (またはアプリケーション固有の配信不能キュー) が用意されています。 そのため、異なるクライアントは同じ配信不能キューを共有しません。

バインディングには、次の 2 つのプロパティがあります。

  • DeadLetterQueue: このプロパティは、配信不能キューが要求されるかどうかを示す列挙体です。 要求された場合、列挙型には配信不能キューの種類も含まれます。 値は、NoneSystemCustom です。 これらのプロパティの解釈の詳細については、「Dead-Letter キューを使用したメッセージ転送エラーの処理」を参照してください。

  • CustomDeadLetterQueue: このプロパティは、アプリケーション固有の配信不能キューの URI (Uniform Resource Identifier) アドレスです。 これは、 DeadLetterQueue場合に必要です。 Custom が選択されます。

有害メッセージ処理プロパティ

サービスがトランザクションの下でターゲット キューからメッセージを読み取ると、さまざまな理由でサービスがメッセージの処理に失敗する可能性があります。 その後、メッセージはキューに戻され、再び読み取られます。 繰り返し失敗するメッセージを処理するために、一連の有害メッセージ処理プロパティをバインディングで構成できます。 ReceiveRetryCountMaxRetryCyclesRetryCycleDelayReceiveErrorHandlingの 4 つのプロパティがあります。 これらのプロパティの詳細については、「 有害メッセージ処理」を参照してください。

セキュリティ プロパティ

MSMQ は、キュー上のアクセス制御リスト (ACL) や認証済みメッセージの送信など、独自のセキュリティ モデルを公開します。 NetMsmqBindingは、トランスポート セキュリティ設定の一部として、これらのセキュリティ プロパティを公開します。 トランスポート セキュリティのバインディングには、 MsmqAuthenticationModeMsmqProtectionLevelの 2 つのプロパティがあります。 これらのプロパティの設定は、MSMQ の構成方法によって異なります。 詳細については、「 トランスポート セキュリティを使用したメッセージのセキュリティ保護」を参照してください。

トランスポート セキュリティに加えて、実際の SOAP メッセージ自体は、メッセージ セキュリティを使用してセキュリティで保護できます。 詳細については、「 メッセージ セキュリティを使用したメッセージのセキュリティ保護」を参照してください。

MsmqTransportSecurity には、 MsmqEncryptionAlgorithmMsmqHashAlgorithmの 2 つのプロパティも公開されています。 これらは、メッセージのキュー間転送の暗号化と署名のハッシュのために選択するさまざまなアルゴリズムの列挙です。

その他のプロパティ

上記のプロパティに加えて、バインディングで公開される他の MSMQ 固有のプロパティは次のとおりです。

  • UseSourceJournal: ソース ジャーナリングが有効になっていることを示すプロパティ。 ソース ジャーナリングは、伝送キューから正常に送信されたメッセージを追跡する MSMQ 機能です。

  • UseMsmqTracing: MSMQ トレースが有効になっていることを示すプロパティ。 MSMQ トレースは、メッセージが MSMQ キュー マネージャーをホストしているマシンにメッセージが出るたびに、または MSMQ キュー マネージャーに到着するたびにレポート メッセージをレポート キューに送信します。

  • QueueTransferProtocol: キュー間メッセージ転送に使用するプロトコルの列挙。 MSMQ は、ネイティブのキュー間転送プロトコルと、SOAP Reliable Messaging Protocol (SRMP) と呼ばれる SOAP ベースのプロトコルを実装します。 SRMP は、キュー間転送に HTTP トランスポートを使用する場合に使用されます。 SRMP セキュアは、キュー間転送に HTTPS を使用する場合に使用されます。

  • UseActiveDirectory: キュー アドレス解決に Active Directory を使用する必要があるかどうかを示すブール値。 既定では、これはオフです。 詳細については、「 サービス エンドポイントとキューのアドレス指定」を参照してください。

MsmqIntegrationBinding (MSMQ統合バインディング)

この MsmqIntegrationBinding は、WCF エンドポイントが C、C++、COM、または System.Messaging API で記述された既存の MSMQ アプリケーションと通信する場合に使用されます。

バインド プロパティは、 NetMsmqBindingの場合と同じです。 ただし、次の違いが適用されます。

  • MsmqIntegrationBindingの操作コントラクトは、型パラメーターが本文の型であるMsmqMessage<T>型の 1 つのパラメーターを受け取ることに制限されています。

  • MSMQ ネイティブ メッセージ プロパティの多くは、使用するために MsmqMessage<T> で公開されています。

  • メッセージ本文のシリアル化と逆シリアル化を支援するために、XML や ActiveX などのシリアライザーが提供されます。

サンプル コード

MSMQ を使用する WCF サービスを記述する手順については、次のトピックを参照してください。

WCF での MSMQ の使用を示す完成したコード サンプルについては、次のトピックを参照してください。

こちらも参照ください