Описание тега 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();
     }
  }
}