リモートマシンにlogという名前のキューがあります。そのキューをローカルで呼び出すときは、NetMsmqBindingを変更して、カスタムのデッドレターキューを指定します。
_binding.DeadLetterQueue = DeadLetterQueue.Custom;
_binding.CustomDeadLetterQueue = new Uri(
"net.msmq://localhost/private/Services/Logging/LogDeadLetterService.svc");
これは正常に機能します。メッセージが宛先に到達しないように強制すると、メッセージはこのキューに表示されます。
これで、デッドレターキューを読み取るためにIIS/WASでホストされているサービスがあります。これは、Services / Logging/LogDeadLetterService.svcのServicesというサイトでホストされていました。これが私の設定のサービスです:
<service name="Me.Logging.Service.LoggingDeadLetterService">
<endpoint binding="netMsmqBinding"
bindingNamespace="http://me.logging/services/2012/11"
contract="Me.Logging.Service.Shared.Service.Contracts.ILog" />
</service>
そして、これが私のアクティベーションです:
<add relativeAddress="LogDeadLetterService.svc"
service="Me.Logging.Service.LoggingDeadLetterService" />
私の実際のサービスは基本的にこれです:
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any, // Pick up any messages, regardless of To address.
InstanceContextMode = InstanceContextMode.Single, // Singleton instance of this class.
ConcurrencyMode = ConcurrencyMode.Multiple, // Multiple callers at a time.
Namespace = "http://me.logging/services/2012/11")]
public class LoggingDeadLetterService : ILog
{
public void LogApplication(ApplicationLog entry)
{
LogToEventLog(entry);
}
}
私のキューはトランザクションで認証されています。サービスサイトとロギングアプリケーションの両方で有効なプロトコルとしてnet.msmqを含め、サービスサイトにnet.msmqバインディングを追加しました。バインディング情報をとして持っている場合、 http://appdev.me.com/Logging/LogDeadLetterService.svc(appdev.me.comは私のHOSTSファイルで設定されています)をappdev.me.com
参照すると、次のエラーが発生します。
An error occurred while opening the queue:Access is denied. (-1072824283, 0xc00e0025).
バインディング情報をとして持っている場合localhost
、次のエラーが発生します。
An error occurred while opening the queue:The queue does not exist or you do not have sufficient permissions to perform the operation. (-1072824317, 0xc00e0003).
どちらの方法で設定しても、サービスはデッドレターを取得しません。これは、イベントログではなく、キューに残っているためです。
今、私はこれらの両方が許可の問題を参照していることに気づきました。ただし、認証部分を理解する前にこのコード部分をテストするために、Everyone、Authenticated Users、NETWORK SERVICE、IIS_USERS、ANONYMOUS LOGON、および私を含む、考えられるすべての人にフルコントロールを与えました。(アプリプールは私として実行されています。)
私のサービスをこのキューからプルできるようにする方法についての助けは驚異的です。ありがとう!
編集:このMSDNブログエントリに よると、0xC00E0003はMQ_ERROR_QUEUE_NOT_FOUNDに対応し、0xc00e0025はMQ_ERROR_ACCESS_DENIEDに対応するため、バインディング情報をとして取得したいようですappdev.me.com
。ただし、それでも、発生している明らかな権限の問題は解決されません。
EDIT2: コンソールアプリでサービスをホストし、次のエンドポイントを提供すると機能します。
<endpoint address="net.msmq://localhost/private/Services/Logging/LogDeadLetterService.svc"
binding="netMsmqBinding"
bindingNamespace="http://me.logging/services/2012/11"
contract="Me.Logging.Service.Shared.Service.Contracts.ILog" />
では、コンソールアプリでは、IISで起こっていることとは何が違うのでしょうか。上記の編集により、私はキューにぶつかっているとかなり確信しています。それで、なぜ私はそれに入ることができないのですか?
EDIT3:ここに記載されているアドバイスに従ってServices / Logging/LogDeadLetterService.svcをLogging/LogDeadLetterService.svcに変更しましたが、変更はありません。
//
[ボーナス質問:デッドレターキューで毒メッセージを処理する必要がありますか?]