Windows Communication Foundation 至訊息佇列
這個範例會示範 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 鍵,即可關閉服務與用戶端。請注意,因為佇列正在使用中,所以用戶端與服務不需要同時啟動與執行。例如,您可以執行用戶端,關閉用戶端,然後再啟動服務,服務還是會收到訊息。
注意: |
---|
這個範例需要安裝訊息佇列。請參閱訊息佇列 (本頁面可能為英文) 中的安裝指示。 |
若要設定、建置及執行範例
若要建置方案的 C# 或 Visual Basic .NET 版本,請遵循建置 Windows Communication Foundation 範例中的指示。
若要在單一機器組態中執行範例,請遵循執行 Windows Communication Foundation 範例中的指示。
若要跨機器執行範例
將語言特定資料夾下 \service\bin\ 資料夾中的服務程式檔複製到服務機器中。
將語言特定資料夾下 \client\bin\ 資料夾中的用戶端程式檔案複製到用戶端機器中。
在 Client.exe.config 檔案中,將用戶端端點位址改為指定服務機器名稱,而不使用 "."。
在服務機器上,從命令提示字元啟動 Service.exe。
在用戶端機器上,從命令提示字元啟動 Client.exe。
請參閱
其他資源
How To: Exchange Messages with WCF Endpoints and MSMQ applications
訊息佇列
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.