wcf服务器如何发送消息,如何:与 WCF 终结点和消息队列应用程序交换消息

如何:与 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();

另请参阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值