SRMP 示例演示了如何通过 HTTP 使用消息队列(MSMQ)进行事务性排队通信。
在排队通信中,客户端使用队列与服务通信。 更确切地说,客户端将消息发送到队列。 服务从队列接收消息。 因此,服务与客户端不必同时运行,才能使用队列进行通信。
MSMQ 允许使用 HTTP(包括使用 HTTPS)将消息发送到队列。 在此示例中,我们演示了如何使用 Windows Communication Foundation(WCF)排队通信以及如何通过 HTTP 发送消息。 MSMQ 使用名为 SRMP 的协议,该协议是基于 SOAP 的协议,用于通过 HTTP 进行通信。
设置、生成和运行示例
确保已为 Windows Communication Foundation 示例 执行One-Time 安装过程。
若要生成解决方案的 C# 或 Visual Basic .NET 版本,请按照 生成 Windows Communication Foundation 示例中的说明进行操作。
若要在单台计算机或跨计算机配置中运行示例,请按照 运行 Windows Communication Foundation 示例中的说明进行操作。
在 添加/删除 Windows 组件中运行示例之前,请确保使用 HTTP 支持安装 MSMQ。 安装 HTTP 支持会自动安装 Internet Information Services (IIS),并在 IIS 中添加 MSMQ 中的协议支持。
如果要确定 HTTP 用于通信,则可以启用 MSMQ 以强化模式运行。 这可确保任何消息都不能使用任何非 HTTP 传输到达计算机上承载的任何队列。
选择 MSMQ 以强化模式运行后,计算机需要在 Windows Server 2003 上重新启动。
运行服务。
运行客户端。 确保更改终结点地址以指向计算机名称或 IP 地址,而不是 localhost。 客户端发送消息并退出。
要求
若要运行此示例,除了 MSMQ 之外,还必须在服务和客户端计算机上安装 IIS。
演示
此示例演示如何使用 MSMQ 通过 HTTP 发送 WCF 排队消息。 这也称为 SRMP 消息传送。 发送排队消息时,发送计算机上的 MSMQ 会通过 TCP 或 HTTP 传输将消息传输到接收队列管理器。 通过选择 SRMP,用户表明他们选择 HTTP 作为队列传输方式。 SRMP Secure 允许使用 HTTPS。
示例:
示例代码基于事务处理示例。 如何将消息发送到队列并使用 SRMP 从队列接收消息,这与使用本机协议发送和接收消息的方式相同。
客户端的配置已更改,以指示队列传输协议的选择。 队列传输协议可以是 Native、SRMP 或 SrmpSecure 之一。 默认情况下,传输协议为原生协议。 客户端和服务在此示例中指定在配置中使用 SRMP。
SRMP 存在与传输安全相关的限制。 默认 MSMQ 传输安全性要求 Active Directory 要求发送队列管理器和接收队列管理器驻留在同一 Windows 域中。 当通过 HTTP 边界发送消息时,这是不可能的。 因此,默认传输安全性不起作用。 如果需要传输安全性,必须将传输安全性设置为“证书”。 消息安全性还可用于保护消息。 在此示例中,传输和消息安全性都已关闭,以演示 SRMP 消息传送。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<!-- Define NetMsmqEndpoint -->
<endpoint name="OrderProcessorEndpoint"
address=
"net.msmq://localhost/private/ServiceModelSamplesSrmp"
bindingConfiguration="srmpBinding"
binding="netMsmqBinding"
contract="IOrderProcessor" />
</client>
<bindings>
<netMsmqBinding>
<binding name="srmpBinding"
queueTransferProtocol="Srmp">
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
</system.serviceModel>
</configuration>
运行示例将生成以下输出。
Processing Purchase Order: 556b70be-31ee-4a3b-8df4-ed5e538015a4
Customer: somecustomer.com
OrderDetails
Order LineItem: 54 of Blue Widget @unit price: $29.99
Order LineItem: 890 of Red Widget @unit price: $45.89
Total cost of this order: $42461.56
Order status: Pending