2016-12-12 2 views
1

Итак, я пытаюсь настроить код клиента для отправки сообщений в очередь MSMQ. Я последовал шаги, описанные здесь: https://msdn.microsoft.com/en-us/library/ms789008(v=vs.100).aspx?cs-save-lang=1&cs-lang=csharp и мой клиент код выглядит следующим образом:Отправка сообщения в msmq queue через msmqIntegrationBinding

class Program 
{ 
    static void Main(string[] args) 
    { 
     var binding = new MsmqIntegrationBinding("MyMessagesBinding"); 
     var address = new EndpointAddress(@"msmq.formatname:DIRECT = OS:.\private$\MyMessages"); 
     var channelFactory = new ChannelFactory<IDataRelayService>(binding, address); 
     var channel = channelFactory.CreateChannel(); 

     while (true) 
     { 
      var message = new MyMessage 
      { 
       Content = "this is content!!!", 
       Id = "random uuid" 
      }; 
      var msmqWrapper = new MsmqMessage<MyMessage>(message) 
      { 
       Priority = MessagePriority.Highest 
      }; 

      channel.PassMessage(msmqWrapper); 
      Console.WriteLine("message sent"); 
      Console.ReadLine(); 
     } 
    } 
} 

App.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> 
    </startup> 
    <system.serviceModel> 
    <client> 
     <endpoint name="MyResponseEndpoint" 
       address="msmq.formatname:DIRECT=OS:.\private$\MyMessages" 
       binding="msmqIntegrationBinding" 
       bindingConfiguration="MyMessagesBinding" 
       contract="Client.IDataRelayService"> 
     </endpoint> 
    </client> 
    <bindings> 
     <msmqIntegrationBinding> 
     <binding name="MyMessagesBinding"> 
      <security mode="None" /> 
     </binding> 
     </msmqIntegrationBinding> 
    </bindings> 
    </system.serviceModel> 
</configuration> 

IDataRelayService.cs:

[ServiceContract] 
public interface IDataRelayService 
{ 
    [OperationContract(IsOneWay = true, Action = "*")] 
    void PassMessage(MsmqMessage<MyMessage> message); 
} 

IDataRelayServiceChannel.cs:

public interface IDataRelayServiceChannel : IDataRelayService, System.ServiceModel.IClientChannel 
{ 
} 

Он компилируется и запускается без проблем, но когда я открываю средство просмотра evet, в MSMQ не регистрируются события. Если я открываю средство управления компьютером для просмотра очередей, он показывает 0 сообщений в моей очереди. Что я здесь делаю неправильно?

EDIT:

Я включил трассировки событий для MSMQ, и вот что зритель событие показывает мне:

enter image description here

+0

Похоже, что сообщения хранятся на машине отправителя. Проверьте службу MSMQ на машине клиента и найдите временную исходящую очередь. Ваши сообщения должны быть на нем. –

+0

Как я могу это увидеть? Я смотрю на управление компьютером/Message Queuing, и я не вижу сообщений, которые хранятся в моей очереди. Вы говорите о каком-то другом инструменте? –

+0

Вы смотрите на исходящие очереди? –

ответ

0

Ваша проблема почти наверняка разрешения связаны между собой.

Услуга счета отправителя сообщения выполняется под должны иметь следующие разрешения MSMQ на очереди он пытается отправить:

  • Отправить сообщение
  • Получить свойства
  • Получить разрешения

Если ваш отправитель находится в другом домене вашего ресивера, вам необходимо предоставить эти разрешения локальному пользователю под названием ANONYMOUS_LOGON.

Также включите регистрацию событий MSMQ E2E: https://technet.microsoft.com/en-us/library/cc730882(v=ws.11).aspx. Это должно сказать вам, что происходит.

Если у вас есть WCF на обоих концах очереди, вы должны использовать netMsmqBinding, а не msmqIntegrationBinding.

+0

Весь мой код и msmq очереди на одной машине. Я запускаю своего отправителя сообщения под повышенным привилегией. –

+0

@ SzwornyDziąch - Проверьте разрешения на очереди. Предоставьте учетную запись, которую вы используете, полностью контролируете очередь. –

+0

Хорошо, сделаю это завтра, когда вернусь на работу, и если это сработает - примите этот ответ. –