我在远程计算机上有一个名为log的队列。当我在本地调用该队列,我修改我的NetMsmqBinding指定自定义死信队列:无法从(死信)队列获取服务
_binding.DeadLetterQueue = DeadLetterQueue.Custom;
_binding.CustomDeadLetterQueue = new Uri(
"net.msmq://localhost/private/Services/Logging/LogDeadLetterService.svc");
也能正常工作;当我强制我的信息无法到达目的地时,它会出现在这个队列中。
现在,我有一个托管在IIS/WAS中的服务来读取死信队列。它托管在一个名为Services的站点上,位于Services/Logging/LogDeadLetterService.svc。下面是我的配置服务:
<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绑定。如果我有绑定信息为appdev.me.com
,我得到的浏览到http://appdev.me.com/Logging/LogDeadLetterService.svc时,下面的错误(appdev.me.com是建立在我的HOSTS文件):
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和我自己。 (应用程序池与我一样运行。)
任何关于如何让我的服务能够从这个队列中拉出的帮助将是惊人的。谢谢!
编辑:根据this MSDN blog entry,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:每给here建议变更的服务/日志/ LogDeadLetterService.svc到记录/ LogDeadLetterService.svc,但没有任何变化。
//
[奖金的问题:我需要在我的死信队列处理有害消息?]
完全控制“每个人” – Didaxis
OP已经表示他这样做了。 –
@ErOx:休是正确的;我已经授予所有人完全控制权。 – zimdanen