Активация WCF для MSMQ, где служба (.svc) находится в корневом каталоге.

VS 2012/.NET4.5, Windows 8/IIS8 и 64 бит

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

Это цитата из MSDN http://msdn.microsoft.com/en-us/library/ms789042.aspx

Активируемое приложение должно совпадать (самое длинное совпадение) с префиксом имени очереди.

Например, имя очереди: msmqWebHost/orderProcessing/service.svc. Если в Приложении 1 есть виртуальный каталог /msmqWebHost/orderProcessing с файлом service.svc, а в Приложении 2 есть виртуальный каталог / msmqWebHost с файлом orderProcessing.svc, приложение 1 активируется. Если приложение 1 удалено, приложение 2 активируется.

Также, http://blogs.msdn.com/b/tomholl/archive/2008/07/12/msmq-wcf-and-iis-getting-them-to-play-nice-part-1.aspx

Однако, когда вы размещаете службу с поддержкой MSMQ в IIS 7 WAS, имя очереди должно совпадать с URI файла.svc вашей службы. В этом примере мы будем размещать службу в приложении MsmqService с файлом.svc MsmqService.svc, поэтому очередь должна называться MsmqService/MsmqService.svc. Очереди, используемые для служб WCF, всегда должны быть частными

И, http://msdn.microsoft.com/en-us/magazine/cc163357.aspx

Важно отметить, что активация конечных точек MSMQ работает правильно только в том случае, если очередь имеет то же имя, что и файл.svc (за исключением имени компьютера). Это означает, что если конечной точкой вашей службы является /server/app/service.svc, имя очереди должно быть app / service.svc.

Файл MyService.svc находится непосредственно в корне моего веб-сайта IIS (который использует пул.NET 4 в интегрированном режиме), поэтому я сделал следующее:

  1. Создание частной транзакционной очереди с именем MyService.svc и предоставление полного доступа к сетевым службам (для тестирования).
  2. Настройка моей конечной точки web.config: address="net.msmq://localhost/private/MyService.svc"
  3. Мне удалось отправить сообщение в очередь, используя клиентское тестовое приложение, используя адрес в (2).
  4. Я добавил поддержку протокола MSMQ на сайт, выполнив следующее:C:\Windows\System32\inetsrv>appcmd set site "MyWebsite" /+bindings.[protocol='net.msmq',bindingInformation='localhost'] (и проверил, что правильно добавил поддержку)
  5. Из моего сайта дополнительные настройки у меня есть http,net.tcp,net.msmq В Enabled Protocols
  6. Я дважды проверил, что "Адаптер прослушивателя Net.Msmq", который отвечает за активацию службы при получении сообщения, работает, и я перезапустил его.
  7. мой web.config:
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpBinding" scheme="http" />
      <add binding="netMsmqBinding" scheme="net.msmq" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="false"
        multipleSiteBindingsEnabled="true" />
    <bindings>
      <netMsmqBinding>
        <binding name="MsmqBinding_IMyService" exactlyOnce="true"
            receiveErrorHandling="Move">
          <security mode="None"/>
        </binding>
      </netMsmqBinding>
    </bindings>
    <services>
      <service name="CompanyName.Service.MyService">
        <endpoint name="MyService"
          address="net.msmq://localhost/private/MyService.svc"
          bindingConfiguration="MsmqBinding_IMyService"
          binding="netMsmqBinding" contract="IMyService" >
        </endpoint>
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="false" />
  </system.webServer>
</configuration>

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

1 ответ

Решение

Проблема решается путем создания приложения на веб-сайте по умолчанию и изменения конфигурации в соответствии с новым путем.

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