次の方法で共有


Windows Communication Foundation へのメッセージ キュー

MsmqToWcf サンプルは、メッセージ キュー (MSMQ) アプリケーションが MSMQ メッセージを Windows Communication Foundation (WCF) サービスに送信する方法を示しています。 このサービスは、キューに登録されたメッセージを受信しているサービスを監視できるようにするためのセルフホステッド コンソール アプリケーションです。

サービス コントラクトは IOrderProcessorであり、キューでの使用に適した一方向サービスを定義します。 MSMQ メッセージには Action ヘッダーがないため、異なる MSMQ メッセージを操作コントラクトに自動的にマップすることはできません。 そのため、操作コントラクトは 1 つだけ存在できます。 サービスに対して複数の操作コントラクトを定義する場合、アプリケーションは MSMQ メッセージのどのヘッダー (ラベルや correlationID など) を使用してディスパッチする操作コントラクトを決定できるかに関する情報を提供する必要があります。

MSMQ メッセージには、操作コントラクトのさまざまなパラメーターにマップされるヘッダーに関する情報は含まれません。 このパラメーターの型は MsmqMessage<T>(MsmqMessage<T>) であり、基になる MSMQ メッセージが含まれています。 MsmqMessage<T>(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);
    …
}

サービスは、次のサンプル コードに示すように、OrderProcessorServiceServiceHostを作成して開きます。

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>

クライアント アプリケーションは、次のサンプル コードに示すように、 Send メソッドを使用して永続的なトランザクション メッセージをキューに送信する MSMQ アプリケーションです。

//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 キーを押して、サービスとクライアントをシャットダウンします。 キューが使用されているため、クライアントとサービスを同時に起動して実行する必要はありません。 たとえば、クライアントを実行してシャットダウンし、サービスを起動しても、そのメッセージを受け取ります。

サンプルを設定、ビルド、実行する

  1. Windows Communication Foundation サンプル One-Time セットアップ手順を実行していることを確認します。

  2. サービスが最初に実行される場合は、キューが存在することを確認します。 キューが存在しない場合、サービスによってキューが作成されます。 最初にサービスを実行してキューを作成することも、MSMQ キュー マネージャーを使用して作成することもできます。 Windows 2008 でキューを作成するには、次の手順に従います。

    1. Visual Studio 2012 でサーバー マネージャーを開きます。

    2. [機能] タブを展開します。

    3. [プライベート メッセージ キュー] を右クリックし、[新規作成][プライベート キュー] の順に選択します。

    4. [トランザクション] ボックスをオンにします。

    5. 新しいキューの名前として「ServiceModelSamplesTransacted」と入力します。

  3. ソリューションの C# または Visual Basic .NET エディションをビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  4. 単一コンピューター構成でサンプルを実行するには、「 Windows Communication Foundation サンプルの実行」の手順に従います。

複数のコンピューターでサンプルを実行する

  1. サービス プログラム ファイルを、言語固有のフォルダーの下にある \service\bin\ フォルダーからサービス コンピューターにコピーします。

  2. クライアント プログラム ファイルを、言語固有のフォルダーの下にある \client\bin\ フォルダーからクライアント コンピューターにコピーします。

  3. Client.exe.config ファイルで orderQueueName を変更し、"." ではなくサービス コンピューター名を指定します。

  4. サービス コンピューターで、コマンド プロンプトから Service.exe を起動します。

  5. クライアント コンピューターで、コマンド プロンプトから Client.exe を起動します。

こちらも参照ください