如何:与 WCF 终结点和消息队列应用程序交换消息
03/30/2017
本文内容
可以通过使用 MSMQ 集成绑定将 MSMQ 消息与 WINDOWS COMMUNICATION FOUNDATION (WCF) 应用程序集成,将 MSMQ) (消息与 WINDOWS COMMUNICATION FOUNDATION (WCF) 应用程序集成。 这允许你从 WCF 客户端调用 MSMQ 接收方应用程序,以及从 MSMQ 发送方应用程序调用 WCF 服务。
本部分介绍如何使用 在 (1) WCF 客户端与使用 System.Messaging 和 (2 编写的 MSMQ 应用程序服务与 MSMQ 应用程序客户端和 WCF 服务之间) 排队 MsmqIntegrationBinding 通信。
有关演示如何从 WCF 客户端调用 MSMQ 接收方应用程序的完整示例,请参阅Windows Communication Foundation 消息队列示例 。
有关演示如何从 MSMQ 客户端调用 WCF 服务的完整示例,请参阅消息队列 以 Windows Communication Foundation示例。
创建从 MSMQ 客户端接收消息的 WCF 服务
定义一个接口,该接口定义从 MSMQ 发送方应用程序接收排队消息的 WCF 服务的服务协定,如以下示例代码所示。
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
[ServiceKnownType(typeof(PurchaseOrder))]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage msg);
} _
_
Public Interface IOrderProcessor
_
Sub SubmitPurchaseOrder(ByVal msg As MsmqMessage(Of PurchaseOrder))
End Interface
实现该接口,将 ServiceBehaviorAttribute 属性应用于该类,如下面示例代码所示。
public class OrderProcessorService : IOrderProcessor
{
[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void SubmitPurchaseOrder(MsmqMessage ordermsg)
{
PurchaseOrder po = (PurchaseOrder)ordermsg.Body;
Random statusIndexer = new Random();
po.Status = (OrderStates)statusIndexer.Next(3);
Console.WriteLine("Processing {0} ", po);
}
// Host the service within this EXE console application.
public static void Main()
{
// Get base address from appsettings in configuration.
Uri baseAddress = new Uri(ConfigurationManager.AppSettings["baseAddress"]);
// Create a ServiceHost for the CalculatorService type and provide the base address.
using (ServiceHost serviceHost = new ServiceHost(typeof(IOrderProcessor), baseAddress))
{
// Open the ServiceHostBase to create listeners and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("The service is running in the following account: {0}", WindowsIdentity.GetCurrent().Name);
Console.WriteLine("Press to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
serviceHost.Close();
}
}
}Public Class OrderProcessorService
Implements IOrderProcessor
_
Public Sub SubmitPurchaseOrder(ByVal ordermsg As MsmqMessage(Of PurchaseOrder)) Implements IOrderProcessor.SubmitPurchaseOrder
Dim po As PurchaseOrder = ordermsg.Body
Dim statusIndexer As New Random()
po.Status = statusIndexer.Next(3)
Console.WriteLine("Processing {0} ", po)
End Sub
End Class
实例化一个 ServiceHost 对象,该对象使用所配置的绑定。
创建向 MSMQ 接收方应用程序发送消息的 WCF 客户端
定义一个接口,该接口定义 WCF 客户端的服务协定,该客户端将排队消息发送到 MSMQ 接收方,如以下示例代码所示。
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IOrderProcessor
{
[OperationContract(IsOneWay = true, Action = "*")]
void SubmitPurchaseOrder(MsmqMessage msg);
}
public interface IOrderProcessorChannel : IOrderProcessor, System.ServiceModel.IClientChannel
{
} _
Public Interface IOrderProcessor
_
Sub SubmitPurchaseOrder(ByVal msg As MsmqMessage(Of PurchaseOrder))
end interface
Public Interface IOrderProcessorChannel
Inherits IOrderProcessor, System.ServiceModel.IClientChannel
End Interface
定义 WCF 客户端用于调用 MSMQ 接收方的客户端类。
MsmqIntegrationBinding binding = new MsmqIntegrationBinding();
EndpointAddress address = new EndpointAddress("msmq.formatname:DIRECT=OS:.\\private$\\Orders");
ChannelFactory channelFactory = new ChannelFactory(binding, address);
IOrderProcessor channel = channelFactory.CreateChannel();
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;
MsmqMessage ordermsg = new MsmqMessage(po);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
channel.SubmitPurchaseOrder(ordermsg);
scope.Complete();
}
Console.WriteLine("Order has been submitted:{0}", po);Dim binding As New MsmqIntegrationBinding()
Dim address As New EndpointAddress("msmq.formatname:DIRECT=OS:.\\private$\\Orders")
Dim channelFactory As New ChannelFactory(Of IOrderProcessor)(binding, address)
Dim channel As IOrderProcessor = channelFactory.CreateChannel()
Dim po As New PurchaseOrder()
po.customerId = "somecustomer.com"
po.poNumber = Guid.NewGuid().ToString()
Dim lineItem1 As New PurchaseOrderLineItem()
lineItem1.productId = "Blue Widget"
lineItem1.quantity = 54
lineItem1.unitCost = 29.99F
Dim lineItem2 = New PurchaseOrderLineItem()
lineItem2.productId = "Red Widget"
lineItem2.quantity = 890
lineItem2.unitCost = 45.89F
Dim lineItems(1) As PurchaseOrderLineItem
lineItems(0) = lineItem1
lineItems(1) = lineItem2
po.orderLineItems = lineItems
Dim ordermsg As MsmqMessage(Of PurchaseOrder) = New MsmqMessage(Of PurchaseOrder)(po)
Using scope As New TransactionScope(TransactionScopeOption.Required)
channel.SubmitPurchaseOrder(ordermsg)
scope.Complete()
End Using
Console.WriteLine("Order has been submitted:{0}", po)
创建一个配置文件,在该配置文件中指定 MsmqIntegrationBinding 绑定的用法。
MsmqIntegrationBinding binding = new MsmqIntegrationBinding("MyBindingConfig");Dim binding As New MsmqIntegrationBinding("MyBindingConfig")
创建该客户端类的一个实例,并调用消息接收服务所定义的方法。
// 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;
OrderProcessorClient client = new OrderProcessorClient("OrderResponseEndpoint");
MsmqMessage ordermsg = new MsmqMessage(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();
Console.WriteLine();
Console.WriteLine("Press to terminate client.");
Console.ReadLine();
另请参阅