Публикация моего решения, на случай, если кому-то понадобится выяснить это
NetMSMQBinding
не поддерживает установку приоритета сообщения со стороны клиента, поэтому я использовал неправильную привязку. Более мощный MsMqIntegrationBinding
- верный путь.
Клиентская сторона:
Со стороны клиента нужно просто создать объект System.Messaging.Message
, установить приоритет и поместить его в объект MessageQueue.MessageQueue
, который указывает на целевой MQ.
Сторона сервера:
Хост-проекту WorkflowService
для размещения WCF требуется следующая конечная привязка в файле web.config:
<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>
Чтобы получить MsmqMessage от MQ и обработать его, нужно удалить действие «Receive» в XAMLX и выбрать Message
в качестве определения содержимого MessageType как System.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere>
Теперь у вас будет доступ к этому MsmqMessage<yourType>
из вашего ActivityContext
, где вы можете получить значение, отправленное в сообщении.
Это очень полезный и мощный способ создания масштабируемой, управляемой с помощью управления приоритетами веб-службы на основе MQ + WCF + WF