2013-05-09 35 views
0

VS 2012/.NET4.5,Windows 8的/ IIS8和64位WCF激活了MSMQ其中服務(.SVC)是根

使用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

然而,當你正在主持在IIS 7中啓用了MSMQ服務WAS, 隊列名稱必須與服務的.svc文件的URI相匹配。在這個 示例中,我們將在稱爲 MsmqService的應用程序中託管服務,該應用程序使用名爲MsmqService.svc的.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端點:地址=「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.msmqEnabled Protocols
  6. 我仔細檢查了該「網.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> 

我的服務是沒有得到新的消息的到達隊列激活和消息留在隊列中。那是因爲我沒有使用應用程序或虛擬目錄,或者有什麼我缺少的東西?

回答

0

通過在默認網站中創建應用程序並修改配置以適應新路徑來對問題進行排序。