Описание тега msmq-wcf
WCF может напрямую взаимодействовать с MSMQ независимо от того, собираетесь ли вы читать / писать из / в MSMQ. WCF также позволяет встраивать компоненты COM/COM+, подобные MSMQ.
MSMQ - это технология для платформы Windows, которая гарантирует доставку сообщений в определенное место назначения. WCF имеет 2 привязки, которые могут читать / писать напрямую в / из MSMQ, без необходимости в конкретном коде - просто конфигурация.
WCF предлагает 2 стратегии привязки:
- NetMsmqBinding - push/pull напрямую в / из MSMQ
- MsmqIntegrationBinding - push/pull напрямую из компонента COM/COM+
Совместное использование MSMQ и WCF на самом деле очень просто. После вставки в MSMQ вам даже не потребуется конкретная реализация в WCF. Простой пример:
namespace WcfServices
{
// Interface is only required for MSMQ
[ServiceContract]
public interface ISendTextService
{
[OperationContract(IsOneWay=true)]
public void Write(string text);
}
}
Чтобы подключить это к файлу конфигурации, вы должны сделать:
<configuration>
<system.serivceModel>
<bindings>
<netMsmqBinding>
<!-- exactlyOnce="false" allows you send multiple MSMQ messages from the channel instance -->
<binding exactlyOnce="false">
<!-- Remove security requirements for testing -->
<security mode="None"/>
</binding>
</bindings>
<client>
<!-- Address format requires net.msmq prefix and no $ sign -->
<!-- The MSMQ 'test' must also already exist for this to work -->
<endpoint address="net.msmq://localhost/private/test"
binding="netMsmqBinding"
contract="WcfService.ISendTextService" />
</client>
</system.serviceModel>
</configuration>
Это касается отправки в MSMQ. Затем клиентское приложение может делать что-то вроде:
public class TestMsmq
{
static void Main(string[] args)
{
var factory = new ChannelFactory<WcfService.ISendTextService>();
var channel = factory.CreateChannel();
// This is required so that they can all be committed together
using(var scope = new TransactionScope(TransactionScopeOption.Required))
{
channel.SendText("Hello, world!");
channel.SendText("Hello, world! - Part 2");
channel.SendText("Hello, world! - Part 3");
scope.Complete();
}
}
}