2012-12-03 21 views
1

我在远程计算机上有一个名为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,但没有任何变化。

//

[奖金的问题:我需要在我的死信队列处理有害消息?]

+0

完全控制“每个人” – Didaxis

+1

OP已经表示他这样做了。 –

+0

@ErOx:休是正确的;我已经授予所有人完全控制权。 – zimdanen

回答

1

因此,需要三件事情要改变:

  1. 结合必须是localhost
  2. 队列必须命名为Logging/LogDeadLetterService.svc才能找到 - 它是应用程序和服务,而不是站点,应用程序和服务。
  3. 我有一些与应用程序池搞砸了 - 我不知道它是什么,但使用不同的应用程序池工作,所以我退出了所有与服务相关的更改,然后重新创建所有内容,并且它可以正常工作。

那么,这是很多撞我的办公桌对我的办公桌,像“不要弄乱你的应用程序池”这样简单的事情。