次の方法で共有


Windows Communication Foundation からメッセージ キューへ

WcfToMsmq サンプルは、Windows Communication Foundation (WCF) アプリケーションがメッセージ キュー (MSMQ) アプリケーションにメッセージを送信する方法を示しています。 このサービスは、キューに登録されたメッセージを受信しているサービスを監視できるようにするためのセルフホステッド コンソール アプリケーションです。 サービスとクライアントを同時に実行する必要はありません。

サービスはキューからメッセージを受信し、注文を処理します。 次のサンプル コードに示すように、サービスはトランザクション キューを作成し、メッセージ受信メッセージ ハンドラーを設定します。

static void Main(string[] args)
{
    if (!MessageQueue.Exists(
              ConfigurationManager.AppSettings["queueName"]))
       MessageQueue.Create(
           ConfigurationManager.AppSettings["queueName"], true);
        //Connect to the queue
        MessageQueue Queue = new
    MessageQueue(ConfigurationManager.AppSettings["queueName"]);
    Queue.ReceiveCompleted +=
                 new ReceiveCompletedEventHandler(ProcessOrder);
    Queue.BeginReceive();
    Console.WriteLine("Order Service is running");
    Console.ReadLine();
}

キューでメッセージを受信すると、メッセージ ハンドラー ProcessOrder が呼び出されます。

public static void ProcessOrder(Object source,
    ReceiveCompletedEventArgs asyncResult)
{
    try
    {
        // Connect to the queue.
        MessageQueue Queue = (MessageQueue)source;
        // End the asynchronous receive operation.
        System.Messaging.Message msg =
                     Queue.EndReceive(asyncResult.AsyncResult);
        msg.Formatter = new System.Messaging.XmlMessageFormatter(
                                new Type[] { typeof(PurchaseOrder) });
        PurchaseOrder po = (PurchaseOrder) msg.Body;
        Random statusIndexer = new Random();
        po.Status = PurchaseOrder.OrderStates[statusIndexer.Next(3)];
        Console.WriteLine("Processing {0} ", po);
        Queue.BeginReceive();
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

}

サービスは、MSMQ メッセージ本文から ProcessOrder を抽出し、順序を処理します。

MSMQ キュー名は、次のサンプル構成に示すように、構成ファイルの appSettings セクションで指定されます。

<appSettings>
    <add key="orderQueueName" value=".\private$\Orders" />
</appSettings>

キュー名にはローカルコンピュータ用にドット (.) を、パス内にはバックスラッシュの区切り記号を使用しています。

次のサンプル コードに示すように、クライアントは発注書を作成し、トランザクションのスコープ内で発注書を送信します。

// Create the purchase order
PurchaseOrder po = new PurchaseOrder();
// Fill in the details
...

OrderProcessorClient client = new OrderProcessorClient("OrderResponseEndpoint");

MsmqMessage<PurchaseOrder> ordermsg = new MsmqMessage<PurchaseOrder>(po);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    client.SubmitPurchaseOrder(ordermsg);
    scope.Complete();
}
Console.WriteLine("Order has been submitted:{0}", po);

//Closing the client gracefully closes the connection and cleans up resources
client.Close();

クライアントは、カスタム クライアントを使用して、MSMQ メッセージをキューに送信します。 メッセージを受信して処理するアプリケーションは、WCF アプリケーションではなく MSMQ アプリケーションであるため、2 つのアプリケーション間に暗黙的なサービス コントラクトはありません。 そのため、このシナリオでは、Svcutil.exe ツールを使用してプロキシを作成することはできません。

カスタム クライアントは基本的に、 MsmqIntegration バインディングを使用してメッセージを送信するすべての WCF アプリケーションで同じです。 他のクライアントとは異なり、さまざまなサービス操作は含まれません。 送信メッセージ操作のみです。

[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true, Action = "*")]
    void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg);
}

public partial class OrderProcessorClient : System.ServiceModel.ClientBase<IOrderProcessor>, IOrderProcessor
{
    public OrderProcessorClient(){}

    public OrderProcessorClient(string configurationName)
        : base(configurationName)
    { }

    public OrderProcessorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress address)
        : base(binding, address)
    { }

    public void SubmitPurchaseOrder(MsmqMessage<PurchaseOrder> msg)
    {
        base.Channel.SubmitPurchaseOrder(msg);
    }
}

サンプルを実行すると、クライアントとサービスのアクティビティが、サービスとクライアントの両方のコンソール ウィンドウに表示されます。 サービスがクライアントからメッセージを受信しているのを確認できます。 各コンソール ウィンドウで Enter キーを押して、サービスとクライアントをシャットダウンします。 キューが使用されているため、クライアントとサービスを同時に起動して実行する必要はありません。 たとえば、クライアントを実行してシャットダウンし、サービスを起動しても、そのメッセージを受け取ります。

このサンプルでは、メッセージ キューをインストールする必要があります。 メッセージ キューのインストール手順を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. Client.exe.config ファイルで、クライアント エンドポイントのアドレスを変更して、"." ではなくサービス コンピューター名を指定します。

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

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

こちらも参照ください