我在远程计算机上有一个名为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);
}
}
我的队列是事务性的并经过身份验证。我在服务站点和Logging应用程序中都包含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中发生的情况不同?由于 EDIT ,我非常有信心,我正在排队。那为什么我不能进入呢?
EDIT3:根据here给出的建议,将服务/日志/ LogDeadLetterService.svc更改为Logging / LogDeadLetterService.svc,但没有变更。
//
[加分问题:我是否需要在死信队列中处理毒药信息?]
答案 0 :(得分:1)
所以,需要改变三件事:
localhost
。Logging/LogDeadLetterService.svc
- 它是应用程序和服务,而不是站点,应用程序和服务。嗯,我的脑袋上碰到了很多东西,就像“不要弄乱你的应用程序池”这样简单。