发布我的解决方案,以防有人需要解决这个问题
NetMSMQBinding
不支持从客户端设置消息优先级,所以我使用了错误的绑定。越强大MsMqIntegrationBinding
是正确的方法。
客户端:从客户端,只需简单地创建一个System.Messaging.Message
对象,设置优先级并将其放入MessageQueue.MessageQueue
指向目标 MQ 的对象中。
服务器端:WorkflowService
托管 WCF 项目需要 web.config 中的以下 endpointBinding:
<endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyWebService/MyProcessingService.xamlx"
binding="msmqIntegrationBinding"
bindingConfiguration="MyMsMqIntegrationBinding"
contract="IMyProcessingService"
name="MqIntegrationBindingEndPoint"
/>
(地址假设 MQ 服务是 WCF 托管的本地服务)
<bindings>
<!--We use msmqIntegrationBinding instead of netMsmqBinding since we want to control priority of MQ messages being dropped in the queue
and that is not supported in netMsmq
-->
<msmqIntegrationBinding>
<binding name="MyMsMqIntegrationBinding" exactlyOnce="false">
<security mode="None" />
</binding>
</msmqIntegrationBinding>
从 MQ 接收 MsmqMessage 并对其进行处理的方法是通过在 XAMLX 中删除“接收”活动并选择Message
内容定义 MessageType 作为System.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere>
现在您可以MsmqMessage<yourType>
从ActivityContext
可以检索发送的值的位置访问它信息。
这是一种非常有用且强大的方式来构建一个可扩展的、具有优先级控制的节流基于 MQ+WCF+WF 的 Web 服务