Как использовать msmq между маршрутизатором WCF и службой WCF, размещенной в службе Windows - PullRequest
1 голос
/ 11 ноября 2011

В моей нынешней системе у меня есть служба маршрутизатора и более дюжины (около половины используют msmq, остальные используют tcp) службы WCF, размещенные через IIS.Мне было поручено переместить все службы, кроме маршрутизатора, в службу Windows.Это было выполнено с использованием тех же конфигураций, которые присутствовали при использовании файла IIS web.config.Вот фрагмент предыдущих конфигураций (общая очередь для службы: myservices / wcfservice):

  <!--Router Service web.config-->
  <client>
    <endpoint address="net.msmq://localhost/MyServices/WCFService.svc" binding="netMsmqBinding" contract="*" name="IWCFService_Msmq" />
  </client>

  <!--Services web.config-->
  <service behaviorConfiguration="SomeServiceBehavior" name="WCFService">
    <endpoint binding="netMsmqBinding" name="IWCFService_Msmq"
      contract="IWCFService" />
    <host>
      <baseAddresses>
        <add baseAddress="net.msmq://localhost/MyServices/WCFService" />
      </baseAddresses>
    </host>
  </service>

Я не понимаю, почему это работает, поскольку служба имеет привязку net.tcp и маршрутизаторимеет msmq, и когда я спросил, мне сказали, что это «магия».Я попытался сделать то же самое с моей установкой (маршрутизатор к службе Windows), используя аналогичную конфигурацию, но получил сообщение об ошибке:

<!--Router Service web.config-->
  <client>
    <endpoint address="net.msmq://localhost/MyServices/WCFService" binding="netMsmqBinding" contract="*" name="IWCFService_Msmq" />
  </client>

  <!--One "other" Services hosted in Windows Service app.config-->
  <service behaviorConfiguration="SomeServiceBehavior" name="WCFService">
    <endpoint binding="netMsmqBinding" name="IWCFService_Msmq"
      contract="IWCFService" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost/MyServices/WCFService" />
      </baseAddresses>
    </host>
  </service>

Это работало нормально со всеми моими службами, которые только используют tcp, ноКогда я пытаюсь сделать это с msmq и пытаюсь запустить службу Windows, я получаю следующую ошибку в окне просмотра событий:

Service cannot be started. System.InvalidOperationException: Could not find a base address that matches scheme net.msmq for the endpoint with binding NetMsmqBinding. Registered base address schemes are [net.tcp].

Я новичок в msmq, поэтому любая помощь с благодарностью.Спасибо!

Обновлено:

Я обновил базовый адрес в сервисе app.config, чтобы он соответствовал адресу, указанному в маршрутизаторе web.config.Я пробовал это ранее, и это не сработало.Позже я узнал, что это потому, что я не сделал сам msmq «Транзакционной очередью» (которая была необходима для нашей установки).Как только это было сделано, все получилось!

<!--One "other" Services hosted in Windows Service app.config-->
  <service behaviorConfiguration="SomeServiceBehavior" name="WCFService">
    <endpoint binding="netMsmqBinding" name="IWCFService_Msmq"
      contract="IWCFService" />
    <host>
      <baseAddresses>
        <add baseAddress="net.msmq://localhost/MyServices/WCFService" />
      </baseAddresses>
    </host>
  </service>

Ответы [ 2 ]

2 голосов
/ 10 сентября 2013

Судя по сообщению об ошибке InvalidOperationException, похоже, что "net.tcp" является единственным включенным протоколом в расширенных настройках вашего приложения, размещенного в IIS.

Является ли "net.msmq" включеннымпротокол?

  1. Открыть диспетчер IIS
  2. Выберите приложение
  3. Нажмите «Расширенные настройки» в списке действий
  4. Добавить «net.msmq» к поведению- Включенные протоколы
1 голос
/ 11 ноября 2011

Почему бы не предоставить всем вашим службам MSMQ свои собственные настройки, а всем службам tcp - свои собственные?Проблема, очевидно, заключается в том, что он ищет базовый адрес, когда вы выбираете привязку msmq, и не может найти привязку msmq, потому что все, что вы предоставили, - это привязка базового адреса tcp.Конечно, вы также можете добавить другой базовый адрес, который использует net.msmq внутри узла baseaddresses.

...