Почему мои сообщения WCF из очереди молча исчезают? - PullRequest
8 голосов
/ 05 октября 2010

У меня есть транзакционная очередь MSMQ на сервере THOR.Я могу отправлять сообщения в эту очередь с рабочей станции со следующим кодом:

var queue = new MessageQueue("FormatName:Direct=OS:thor\\private\\myqueue");
using (var tx = new MessageQueueTransaction())
{
   tx.Begin();
   queue.Send("test", tx);
   tx.Commit();
}

Однако, когда я пытаюсь подключиться с помощью WCF, мои сообщения никогда не появляются в очереди.Вот конфигурация, которую я использую:

<system.serviceModel>
  <bindings>
    <netMsmqBinding>
      <binding name="ClientNewsFeedServiceBinding" durable="true" exactlyOnce="true">
        <security mode="None" />
      </binding>
    </netMsmqBinding>
  </bindings>

  <client>
    <!-- NewsFeed Service -->
    <endpoint name="INewsFeedService"
              address="net.msmq://thor/private/myqueue"
              binding="netMsmqBinding"
              bindingConfiguration="ClientNewsFeedServiceBinding"
              contract="Service.Contract.INewsFeedService" />
  </client>
</system.serviceModel>

И код:

using (var tx = new TransactionScope())
{
   var cf = new ChannelFactory<INewsFeedService>("INewsFeedService");
   var service = cf.CreateChannel();
   service.TestMessage("test");
   ((IChannel)service).Close();
   tx.Complete();
}

Я не получаю никаких исключений, но в очереди на THOR нет сообщений, размещенных в очереди.,Есть идеи?Я даже не знаю, как отладить это, так как это просто молча терпит неудачу.

ОБНОВЛЕНИЕ

Если я изменю свой MSMQ URI на 'net.msmq: // localhost/ private / myqueue ', то он отправит в локальную очередь транзакций, которую я настроил.Настройка самой очереди идентична (например, я выполнил те же шаги для создания очередей localhost и THOR).

Ответы [ 5 ]

3 голосов
/ 05 октября 2010

Полагаю, если вы делаете свою очередь транзакционной на стороне сервера MSMQ, вам нужно указать еще несколько параметров в конфигурации привязки WCF - попробуйте это:

<bindings>
    <netMsmqBinding>
      <binding name="ClientNewsFeedServiceBinding" 
               durable="true" exactlyOnce="true">
        <security mode="None" />
      </binding>
    </netMsmqBinding>
  </bindings>

Если я не ошибаюсь,чтобы это работало, вам нужно добавить атрибуты durable="true" и exactlyOnce="true" в привязку netMsmq.

Существует действительно хорошее руководство о том, как заставить MSMQ и WCF хорошо работать вместе:

Том частично покрывает транзакционные очереди3, и упоминает:

Атрибут точноOnce = "true" говорит WCF для использования очереди транзакционных сообщений.

durable=true означает только наличиесообщения сразу записываются на диск, вместо того, чтобы хранить их в памяти сервера.Это медленнее, но в случае сбоя сервера или прерывания питания сообщения не теряются.Классический компромисс между скоростью и надежностью ....

Обновление: , поскольку вы пересекаете границы компьютера и используете транзакционную очередь - вы проверили код неисправности (распределенный)Координатор транзакций) на всех задействованных машинахПосмотрите блог Тома, часть 3:

Проверьте настройку DTC

Наше эпическое путешествие почти закончено.На самом деле, если вы все еще играете дома, вы можете попробовать запустить приложение с транзакционными очередями, чтобы посмотреть, работает ли оно. В случае сбоя одной из возможных причин являются проблемы с конфигурацией вашего координатора распределенных транзакций. Вот несколько вещей, которые нужно попробовать:

1 голос
/ 24 ноября 2013

У меня была такая же проблема.Испытав все идеи, перечисленные здесь, я начал искать что-то еще.Оказалось, что при выборе режима безопасности Нет свойства отправителя моего сообщения остаются пустыми (см. Рисунок ниже).

MSMQ Message properties

Такое сообщение будетприниматься при отправке на localhost, но удаленный сервер отклоняет его.

Чтобы заставить его работать, у вас есть несколько вариантов:

  1. Включить аутентификацию
  2. Предоставить Отправить разрешения на АНОНИМНЫЙ ВХОД

Первый вариант, если он, конечно, безопаснее, но требует установки MSMQ с интеграцией с Active Directory.

0 голосов
/ 11 октября 2010

Вам необходимо использовать MsmqIntegrationBinding. Сообщения не распознаются и отбрасываются, поскольку WCF не знает, что они собой представляют.

0 голосов
/ 06 октября 2010

У меня была похожая проблема, поэтому я надеюсь, что этот контрольный список поможет:

  1. Связь : Я полагаю, что запись DNS работает, не так ли?Убедитесь, что он выполняет команду ping ...
  2. Разрешения для разных доменов : у меня были проблемы с некоторыми спринтами назад, причина была в разрешениях.Моя тестируемая локальная машина находилась в другом домене, чем сервер.Убедитесь, что тор и ваш компьютер находятся в одном домене.Возможно иметь его в разных доменах, но у меня не получилось, чтобы он работал (поэтому я переместил свои тесты на компьютер в том же домене)
  3. Инструмент очередей : хотя вы можете видеть очереди изАдминистративные инструменты Я обнаружил, что инструмент проводника очереди (http://cogin.com/mq/index.php) довольно полезен. Вы можете проверить, где сообщения застряли.

ПРИМЕЧАНИЕ: вероятно, 1 в порядке, но на всякий случай я поставилэто ...

0 голосов
/ 05 октября 2010

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

Когда вы закрываете канал, вы теряете с ним контакт, поэтому у него есть незафиксированная транзакция, которая в конечном итоге отбрасывается.

...