共用方式為


視窗通訊架構到訊息佇列系統

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 訊息傳送至佇列。 因為接收和處理訊息的應用程式是 MSMQ 應用程式,而不是 WCF 應用程式,因此這兩個應用程式之間沒有隱含的服務合約。 因此,在此案例中,我們無法使用 Svcutil.exe 工具來建立 Proxy。

所有使用系結來傳送訊息的 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. 以滑鼠右鍵按兩下 [私人消息佇列],然後選取 [ 新增>私人佇列]。

    4. 勾選 [交易式] 方塊。

    5. 輸入 ServiceModelSamplesTransacted 作為新佇列的名稱。

  3. 若要建置解決方案的 C# 或 Visual Basic 版本,請遵循 建置 Windows Communication Foundation 範例中的指示。

  4. 若要在單一計算機設定中執行範例,請遵循 執行 Windows Communication Foundation 範例中的指示。

在不同的電腦上運行範例

  1. 將服務程式檔案從語言專用資料夾中的 \service\bin\ 資料夾,複製到服務電腦。

  2. 將用戶端程式檔案從語言特定資料夾下的 \client\bin\ 資料夾,複製到用戶端電腦。

  3. 在 Client.exe.config 檔案中,變更用戶端端點位址以指定服務計算機名稱,而不是 “.”。

  4. 在伺服器上,從命令列啟動 Service.exe。

  5. 在用戶端電腦上,從命令提示符啟動 "Client.exe"。

另請參閱