Windows Communication Foundation へのメッセージ キュー
このサンプルでは、メッセージ キュー (MSMQ) アプリケーションで MSMQ メッセージを Windows Communication Foundation (WCF) サービスに送信する方法について説明します。サービスは、自己ホスト型コンソール アプリケーションで、サービスがキュー内のメッセージを受信したかどうかを監視できます。
サービス コントラクトは IOrderProcessor
です。これは、キューでの使用に適した一方向サービスを定義します。MSMQ メッセージには Action ヘッダーがないので、さまざまな MSMQ メッセージを操作コントラクトに自動的にマッピングすることはできません。したがって、存在する操作コントラクトは 1 つだけです。サービスに対して複数の操作コントラクトを定義する場合は、ディスパッチする操作コントラクトを決定するために使用できる、MSMQ メッセージ内のヘッダー (ラベルや correlationID など) に関する情報をアプリケーションで提供する必要があります。これについては、「カスタム Demux」を参照してください。
MSMQ メッセージには、操作コントラクトの別のパラメータにマッピングされるヘッダーに関する情報は含まれません。パラメータは MsmqMessage 型の MsmqMessage<T> です。これには、基になる MSMQ メッセージが含まれます。MsmqMessage (MsmqMessage<T>) クラスの型 "T" は、シリアル化されて MSMQ メッセージ本文に含まれているデータを表します。このサンプルでは、PurchaseOrder
型がシリアル化されて MSMQ メッセージ本文になっています。
発注書処理サービスのサービス コントラクトを次のサンプル コードに示します。
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}
サービスは自己ホスト型です。MSMQ を使用する場合、使用するキューをあらかじめ作成しておく必要があります。手動で作成することもコードで作成することもできます。このサンプルでは、サービスはキューの存在を確認し、必要な場合はキューを作成します。キュー名は構成ファイルから読み込まれます。
public static void Main()
{
// Get the MSMQ queue name from the application settings in
// configuration.
string queueName = ConfigurationManager.AppSettings["queueName"];
// Create the MSMQ queue if necessary.
if (!MessageQueue.Exists(queueName))
MessageQueue.Create(queueName, true);
…
}
サービスは、OrderProcessorService
の ServiceHost を作成して開きます。次のサンプル コードを参照してください。
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
serviceHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.ReadLine();
serviceHost.Close();
}
MSMQ キュー名は、構成ファイルの appSettings セクションに指定されます。次のサンプル構成を参照してください。
メモ : |
---|
キューの名前では、ローカル コンピュータにはドット (.) が使用され、そのパスにはバックスラッシュが使用されます。WCF エンドポイント アドレスでは msmq.formatname スキームが指定され、ローカル コンピュータを表す localhost が使用されます。それぞれの MSMQ 形式名のアドレス指定ガイドラインに対するキューのアドレスが msmq.formatname スキームの後に続きます。 |
<appSettings>
<add key="orderQueueName" value=".\private$\Orders" />
</appSettings>
クライアント アプリケーションは MSMQ アプリケーションです。このアプリケーションでは Send メソッドを使用して、非揮発性メッセージとトランザクション メッセージをキューに送信します。次のサンプル コードを参照してください。
//Connect to the queue.
MessageQueue orderQueue = new MessageQueue(ConfigurationManager.AppSettings["orderQueueName"]);
// Create the purchase order.
PurchaseOrder po = new PurchaseOrder();
po.CustomerId = "somecustomer.com";
po.PONumber = Guid.NewGuid().ToString();
PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem();
lineItem1.ProductId = "Blue Widget";
lineItem1.Quantity = 54;
lineItem1.UnitCost = 29.99F;
PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem();
lineItem2.ProductId = "Red Widget";
lineItem2.Quantity = 890;
lineItem2.UnitCost = 45.89F;
po.orderLineItems = new PurchaseOrderLineItem[2];
po.orderLineItems[0] = lineItem1;
po.orderLineItems[1] = lineItem2;
// Submit the purchase order.
Message msg = new Message();
msg.Body = po;
//Create a transaction scope.
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
orderQueue.Send(msg, MessageQueueTransactionType.Automatic);
// Complete the transaction.
scope.Complete();
}
Console.WriteLine("Placed the order:{0}", po);
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
サンプルを実行すると、クライアントとサービスのアクティビティがサービスとクライアントの両方のコンソール ウィンドウに表示されます。サービスがクライアントから受信したメッセージを表示できます。どちらかのコンソールで Enter キーを押すと、サービスとクライアントがどちらもシャットダウンされます。キューが使用されているので、クライアントとサービスが同時に実行されている必要はありません。たとえば、クライアントを実行してシャットダウンした後にサービスを起動しても、サービスはメッセージを受信します。
サンプルをセットアップ、作成、および実行するには
「Windows Communication Foundation サンプルの 1 回限りのセットアップの手順」が実行済みであることを確認します。
ソリューションの C# 版または Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。
単一コンピュータ構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。
サンプルを別のコンピュータで実行するには
サービス プログラム ファイルを、言語固有のフォルダにある \service\bin\ フォルダからサービス コンピュータにコピーします。
クライアント プログラム ファイルを、言語固有のフォルダにある \client\bin\ フォルダからクライアント コンピュータにコピーします。
Client.exe.config ファイルで、orderQueueName を変更して "." の代わりにサービス コンピュータを指定します。
サービス コンピュータで、コマンド プロンプトから Service.exe を起動します。
クライアント コンピュータで、コマンド プロンプトから Client.exe を起動します。
関連項目
その他の技術情報
Queues in Windows Communication Foundation
How To: Exchange Messages with WCF Endpoints and MSMQ applications
メッセージ キュー
Copyright © 2007 by Microsoft Corporation.All rights reserved.