次の方法で共有


サービス エンドポイントとキューのアドレス指定

このトピックでは、クライアントがキューから読み取るサービスをアドレス指定する方法と、サービス エンドポイントがキューにマップされる方法について説明します。 次の図は、従来の Windows Communication Foundation (WCF) キューに登録されたアプリケーションの展開を示しています。

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

クライアントがメッセージをサービスに送信するために、クライアントはメッセージをターゲット キューにアドレス指定します。 サービスがキューからメッセージを読み取るために、そのリッスン アドレスをターゲット キューに設定します。 WCF でのアドレス指定は URI (Uniform Resource Identifier) ベースですが、メッセージ キュー (MSMQ) キュー名は URI ベースではありません。 そのため、WCF を使用して MSMQ で作成されたキューに対処する方法を理解することが不可欠です。

MSMQ アドレス指定

MSMQ では、パスと形式名を使用してキューを識別します。 パスは、ホスト名と QueueNameを指定します。 必要に応じて、ホスト名とQueueNameの間にPrivate$があり、Active Directory ディレクトリ サービスで公開されていないプライベート キューを示すことができます。

パス名が "FormatNames" にマップされ、ルーティングやキュー マネージャー転送プロトコルなど、アドレスの追加の側面が決定されます。 Queue Manager では、ネイティブ MSMQ プロトコルと SOAP Reliable Messaging Protocol (SRMP) の 2 つの転送プロトコルがサポートされています。

MSMQ のパスと形式の名前の詳細については、「 メッセージ キューについて」を参照してください。

NetMsmqBinding とサービス アドレス指定

サービスにメッセージをアドレス指定する場合、URI のスキームは、通信に使用されるトランスポートに基づいて選択されます。 WCF の各トランスポートには、一意のスキームがあります。 このスキームは、通信に使用されるトランスポートの性質を反映している必要があります。 たとえば、net.tcp、net.pipe、HTTP などです。

WCF の MSMQ キューに登録されたトランスポートは、net.msmq スキームを公開します。 net.msmq スキームを使用してアドレス指定されたすべてのメッセージは、MSMQ キューに登録されたトランスポート チャネル経由で NetMsmqBinding を使用して送信されます。

WCF でのキューのアドレス指定は、次のパターンに基づいています。

net.msmq: // <host-name> / [private/] <queue-name>

どこで:

  • < host-name> は、ターゲット キューをホストするマシンの名前です。

  • [private] は省略可能です。 これは、プライベート キューであるターゲット キューをアドレス指定するときに使用されます。 パブリック キューに対処するには、private を指定しないでください。 MSMQ パスとは異なり、WCF URI 形式には "$" はありません。

  • < queue-name> はキューの名前です。 キュー名は、サブキューを参照することもできます。 したがって、 <queue-name> = <name-of-queue>[;sub-queue-name]。

例 1: コンピューター abc atadatum.com でホストされているプライベート キュー PurchaseOrders に対処するには、URI は net.msmq://abc.adatum.com/private/PurchaseOrders になります。

例 2: コンピューター def atadatum.com でホストされているパブリック キュー AccountsPayable に対処するには、URI は net.msmq://def.adatum.com/AccountsPayable になります。

キュー アドレスは、リスナーがメッセージを読み取るリッスン URI として使用されます。 つまり、キュー アドレスは TCP ソケットのリッスン ポートと同じです。

キューから読み取るエンドポイントは、ServiceHost を開くときに前に指定したのと同じスキームを使用して、キューのアドレスを指定する必要があります。 例については、「 Net MSMQ バインド」を参照してください。

キュー内の複数のコントラクト

キュー内のメッセージは、異なるコントラクトを実装できます。 この場合、すべてのメッセージを正常に読み取って処理するには、次のいずれかが当てはまることが重要です。

  • すべてのコントラクトを実装するサービスのエンドポイントを指定します。 これは推奨されるアプローチです。

  • コントラクトが異なる複数のエンドポイントを指定しますが、すべてのエンドポイントで同じ NetMsmqBinding オブジェクトが使用されていることを確認します。 ServiceModel のディスパッチ ロジックでは、ディスパッチのためにトランスポート チャネルからメッセージを読み取るメッセージ ポンプが使用され、最終的にはコントラクトに基づいて異なるエンドポイントへのメッセージの多重化が解除されます。 リッスン URI とバインドのペアに対してメッセージ ポンプが作成されます。 キュー アドレスは、キューに登録されたリスナーによってリッスン URI として使用されます。 すべてのエンドポイントで同じバインド オブジェクトを使用すると、1 つのメッセージ ポンプを使用してメッセージを読み取り、コントラクトに基づいて関連するエンドポイントに多重化解除することができます。

SRMP メッセージング

前に説明したように、キュー間転送には SRMP プロトコルを使用できます。 これは、HTTP トランスポートが伝送キューとターゲット キューの間でメッセージを送信する場合に一般的に使用されます。

SRMP 転送プロトコルを使用するには、前述のように net.msmq URI スキームを使用してメッセージをアドレス指定し、NetMsmqBindingQueueTransferProtocol プロパティで SRMP または Secure SRMP の選択を指定します。

QueueTransferProtocol プロパティの指定は送信専用機能です。 これは、使用するキュー転送プロトコルの種類をクライアントが示します。

Active Directory の使用

MSMQ には、Active Directory 統合のサポートが付属しています。 MSMQ が Active Directory 統合と共にインストールされている場合、コンピューターは Windows ドメインの一部である必要があります。 Active Directory は、検出のためにキューを発行するために使用されます。このようなキューは パブリック キューと呼ばれます。 キューのアドレス指定時に、Active Directory を使用してキューを解決できます。 これは、ドメイン ネーム システム (DNS) を使用してネットワーク名の IP アドレスを解決する方法と似ています。 NetMsmqBindingUseActiveDirectory プロパティは、キューに登録されたチャネルが Active Directory を使用してキュー URI を解決する必要があるかどうかを示すブール値です。 既定では、 false に設定されています。 UseActiveDirectory プロパティが true に設定されている場合、キューに登録されたチャネルは Active Directory を使用して net.msmq:// URI を形式名に変換します。

UseActiveDirectory プロパティは、メッセージの送信時にキューのアドレスを解決するために使用されるため、メッセージを送信しているクライアントに対してのみ意味があります。

net.msmq URI をメッセージ キュー形式名にマッピングする

キューに登録されたチャネルは、チャネルに指定された net.msmq URI 名を MSMQ 形式名にマッピングする処理を行います。 次の表は、それらの間のマップに使用されるルールをまとめたものです。

WCF URI ベースのキュー アドレス Active Directory プロパティを使用する Queue Transfer Protocol プロパティ 結果の MSMQ 形式名
Net.msmq://<machine-name>/private/abc False (既定値) ネイティブ (既定) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc いいえ SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc 正しい ネイティブ PUBLIC=some-guid (キューの GUID)

Dead-Letter キューまたは Poison-Message キューからのメッセージの読み取り

ターゲット キューのサブキューである有害メッセージ キューからメッセージを読み取るために、サブキューのアドレスで ServiceHost を開きます。

例: ローカル コンピューターから PurchaseOrders プライベート キューの有害メッセージ キューから読み取るサービスは、net.msmq://localhost/private/PurchaseOrders をアドレス指定します。毒。

システム トランザクション配信不能キューからメッセージを読み取るには、URI が net.msmq://localhost/system$ の形式である必要があります。DeadXact。

システムの非トランザクション配信不能キューからメッセージを読み取るには、URI が net.msmq://localhost/system$ の形式である必要があります。DeadLetter。

カスタム配信不能キューを使用する場合は、配信不能キューがローカル コンピューターに存在する必要があることに注意してください。 そのため、配信不能キューの URI は次の形式に制限されます。

net.msmq: //localhost/ [private/] <custom-dead-letter-queue-name>。

WCF サービスは、受信したすべてのメッセージが、リッスンしている特定のキューにアドレス指定されたことを確認します。 メッセージの宛先キューが見つかったキューと一致しない場合、サービスはメッセージを処理しません。 これは、配信不能キュー内のメッセージが他の場所に配信されることを意図していたため、配信不能キューをリッスンしているサービスが対処する必要がある問題です。 配信不能キューまたは有害キューからメッセージを読み取る場合は、Any パラメーターを持つServiceBehaviorを使用する必要があります。 例については、「 配信不能キュー」を参照してください。

MsmqIntegrationBinding とサービス アドレス指定

MsmqIntegrationBindingは、従来の MSMQ アプリケーションとの通信に使用されます。 既存の MSMQ アプリケーションとの相互運用を容易にするために、WCF では形式名のアドレス指定のみがサポートされます。 したがって、このバインディングを使用して送信されるメッセージは、URI スキームに準拠している必要があります。

msmq.formatname:<MSMQ-format-name>>

MSMQ 形式名は、 メッセージ キューについてで MSMQ で指定された形式です。

MsmqIntegrationBindingを使用してキューからメッセージを受信する場合は、直接形式名とパブリック形式名とプライベート形式名 (Active Directory 統合が必要) のみを使用できることに注意してください。 ただし、直接形式名を使用することをお勧めします。 たとえば、Windows Vista では、他の形式名を使用すると、システムがサブキューを開こうとするため、エラーが発生します。これは直接形式名でのみ開くことができます。

MsmqIntegrationBindingを使用して SRMP に対処する場合、インターネット インフォメーション サービス (IIS) のディスパッチに役立つ直接形式名に /msmq/ を追加する必要はありません。 例: SRMP プロトコルを使用してキュー abc をアドレス指定する場合、 DIRECT=http://adatum.com/msmq/private$/abcではなく、 DIRECT=http://adatum.com/private$/abcを使用する必要があります。

MsmqIntegrationBindingでは net.msmq:// アドレス指定を使用できないことに注意してください。 MsmqIntegrationBindingでは自由形式の MSMQ 形式の名前のアドレス指定がサポートされているため、このバインディングを使用する WCF サービスを使用して、MSMQ のマルチキャストおよび配布リスト機能を使用できます。 1 つの例外は、MsmqIntegrationBindingを使用するときにCustomDeadLetterQueueを指定する場合です。 NetMsmqBindingを使用して指定する方法と同様に、net.msmq://という形式にする必要があります。

こちらも参照ください