WCF MSMQ, размещенный в IIS7, не получал сообщения автоматически до тех пор, пока я вручную не включил службу

Я видел несколько сообщений, связанных с этим, но я не нашел ответа на мою проблему

Итак, у меня есть клиент, отправляющий сообщения в MSMQ с помощью привязки WCF netmsmq. Это отлично работает.

У меня есть веб-сайт, размещенный в моем локальном IIS7 (Windows 7), который предоставляет конечную точку WCF MSMQ.

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

Итак, что мне нужно сделать, чтобы сообщения автоматически отправлялись моей службой WCF, размещенной в IIS?

Примечание. Я только что заметил, что после вызова любой службы WCF, размещенной в моем веб-приложении в IIS, происходит активация службы или чего-то еще, и внезапно сообщения очереди потребляются...

Конфигурация клиента

  <system.serviceModel>
    <client>
      <endpoint name="Service.ServiceContracts.QueueLoggingService NET MSMQ"
                address="net.msmq://localhost/private/Service.WebHost/QueueLoggingService.svc"
                binding="netMsmqBinding"
                contract="Service.ServiceContracts.IQueueLoggingService">
      </endpoint>
    </client>
    <bindings>
      <netMsmqBinding>
        <binding exactlyOnce="true" durable="true" maxRetryCycles="15" receiveRetryCount="15">
          <security mode="None">
            <message clientCredentialType="None" />
            <transport msmqAuthenticationMode="None" />
          </security>
        </binding>
      </netMsmqBinding>
    </bindings>
  </system.serviceModel>

Конфигурация сервера

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
    <services>
      <service name="Service.ServiceImplementations.QueueLoggingService">
        <endpoint 
                  address="net.msmq://localhost/private/Service.WebHost/QueueLoggingService.svc"
                  binding="netMsmqBinding"
                  contract="Service.ServiceContracts.IQueueLoggingService">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <netMsmqBinding>
        <binding exactlyOnce="true" durable="true" maxRetryCycles="15" receiveRetryCount="15">
          <security mode="None">
            <message clientCredentialType="None" />
            <transport msmqAuthenticationMode="None" />
          </security>
        </binding>
      </netMsmqBinding>
    </bindings>
  </system.serviceModel>

Вещи, которые я пробовал:

  • Служба очереди сообщений работает
  • Запущена служба триггеров очереди сообщений
  • Запущена служба адаптера прослушивателя Net.Msmq
  • Запущена служба адаптера прослушивателя Net.Pipe
  • Запущена служба адаптера прослушивателя Net.Tcp
  • Служба службы общего доступа к портам Net.Tcp работает
  • Служба координатора распределенных транзакций работает
  • MSMQ Active Directory Интеграция доменных служб установлена
  • Поддержка MSMQ HTTP установлена
  • Триггеры MSMQ установлены
  • Установлена ​​поддержка многоадресной рассылки MSMQ
  • Активация WCF без HTTP установлена
  • Активация WCF HTTP установлена
  • AppPool настроен на автоматический запуск
  • Мой веб-сайт по умолчанию содержит следующую конфигурацию:

            <application path="/Service.WebHost" applicationPool="MyGenericAppPool" enabledProtocols="net.msmq, http">
                <virtualDirectory path="/" physicalPath="C:\Some Path\Service.WebHost" />
            </application>
    
            <bindings>
                <binding protocol="http" bindingInformation="*:80:" />
                <binding protocol="net.tcp" bindingInformation="808:*" />
                <binding protocol="net.pipe" bindingInformation="*" />
                <binding protocol="net.msmq" bindingInformation="localhost" />
                <binding protocol="msmq.formatname" bindingInformation="localhost" />
            </bindings>
    

2 ответа

Решение

Функция автозапуска обеспечивается AppFabric, поэтому вы должны установить его. Затем вы сможете использовать командную строку, аналогичную этой, для автоматического запуска вашего WAS-приложения:

appcmd.exe set app /app.name:YourApplication / serviceAutoStartEnabled: True / serviceAutoStartMode: все

Хорошо

Этот парень сэкономил мне много часов:

Пол Бахлер @paulbahler

Оказывается, что даже когда AppPool был установлен на автоматический запуск.... это было не по назначению...

Итак, этот парень предложил мне установить инструменты App Fabric, а затем просто настроить приложение для автоматического запуска и работать с ним.

Другие вопросы по тегам