VS 2012/.NET4.5、Windows 8/IIS8 および 64 ビット
WCF サービス アプリケーションを使用して、サービス名に一致するように MSMQ キューに名前を付けるこれまでに見たすべてのドキュメントは、IIS Web サイトの下のアプリケーションまたは仮想ディレクトリを使用しているという事実を前提としています。
これは 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 がアクティブになります。
ただし、IIS 7 WAS で MSMQ 対応サービスをホストしている場合、キュー名はサービスの .svc ファイルの URI と一致する必要があります。この例では、MsmqService.svc という .svc ファイルを使用して MsmqService というアプリケーションでサービスをホストするため、キューは 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 Web サイト (統合モードで .NET 4 プールを使用) のルートの直下にあるため、次のことを行いました。
- MyService.svc という名前のプライベート トランザクション キューを作成し、Network Services にフル コントロールを付与します (テスト用)。
- web.config エンドポイントの設定: address="net.msmq://localhost/private/MyService.svc"
- (2) のアドレスを使用して、クライアント テスト アプリケーションを使用してメッセージをキューにプッシュできました。
- 以下を実行して、MSMQ プロトコルのサポートを Web サイトに
C:\Windows\System32\inetsrv>appcmd set site "MyWebsite" /+bindings.[protocol='net.msmq',bindingInformation='localhost']
追加しました (そして、サポートが適切に追加されていることを確認しました)。 - 私が持っている私のウェブサイトの詳細設定
http,net.tcp,net.msmq
からEnabled Protocols
- メッセージが到着したときにサービスをアクティブ化する役割を担う「Net.Msmq Listener Adapter」が実行されていることを再確認し、再起動しました。
- 私の
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>
新しいメッセージがキューに到着してもサービスがアクティブ化されず、メッセージがキューに残ります。これは、アプリケーションまたは仮想ディレクトリを使用していないためですか、それとも不足しているものがありますか?