使用Authenticate复选框选中是否将消息发送到私有MSMQ队列?

时间:2013-06-14 08:33:39

标签: .net wcf msmq msmqintegrationbinding

在发布此问题之前,我搜索了所有论坛帖子。我发现我的问题类似于Sending to authenticated queue但是该线程并没有真正回答我的问题。

我有以下设置(使用.NET应用程序和MSMQ)

  • 在我的Windows7 64位计算机上安装 MSMQ,具有Active Directory服务集成模式
  • 我创建了两个专用队列(PQ1和PQ2)作为Transactional队列,并配置了其Security选项卡以提供对域用户ID的完全访问权限(域用户ID,也是Win7机器上的Administartor)。
  • 在我的项目中,我有三个.NET 4.0应用程序,这些应用程序由Windows服务(在同一个域用户ID上运行,具有相同域用户ID的访问权限)托管
  • 第一个.NET应用程序在自己的线程上运行,该线程从数据库读取数据并将MSMQ消息发送到PQ1队列
  • 第二个和第三个是从Windows服务自托管的WCF应用程序(比如wcfA和wcfB)。
  • wcfA和wcfB配置为具有传输安全模式的MsmqIntegrationBinding,其中属性mqAuthenticationMode设置为“WindowsDomain”,msmqProtectionLevel设置为“EncryptAndSign”
  • wcfA从PQ1接收消息,然后处理该消息并向PQ2发送另一条MSMQ消息
  • wcfB从PQ2获取消息并进行处理

请注意,在上面的设置中一切正常。

但是,当我在其常规选项卡上启用专用队列PQ1和PQ2的“已验证”复选框时,问题就开始了。在此设置之后,第一个应用程序将MSMQ消息发送到专用队列,但它最终在“事务死信消息”队列中。 我尝试将经过身份验证的用户组添加到“队列安全性”选项卡并提供完全访问权限但不起作用。

除此之外,我还观察到消息到“死信”队列的“属性”页面上的“发件人”选项卡显示已验证:否

非常感谢您的帮助,使应用程序与Authenticated Queue一起使用。

1 个答案:

答案 0 :(得分:4)

初始化Message对象后,设置 UseAuthentication属性true

将消息发送到经过身份验证的队列的示例:

private void SendToQueue(string queueMessage)
{
   var message = new System.Messaging.Message(queueMessage);
   message.UseDeadLetterQueue = true;            

   // This line resolved issue for sending message to queue with Authenticate checkbox checked. 
   message.UseAuthentication = true; 

   var queue = new System.Messaging.MessageQueue(@"FormatName:Direct=OS:.\private$\PQ1");
   queue.Send(message, MessageQueueTransactionType.Single);
}