WCF - 在新环境中找不到MSMQ端点

时间:2016-06-02 07:01:19

标签: wcf msmq netmsmqbinding

设置

我在Windows Server 2012R2上运行的IIS / AppFabric中托管了WCF服务。 该服务通过netMsmqBinding绑定到本地事务MSMQ队列。我的操作使用TransactionScopeRequired = true进行修饰。 服务操作接收来自BizTalk服务器的调用,处理它们并将响应发送回远程队列(在同一BizTalk Server上),也通过netMsmqBinding。

<endpoint name="Outbound" address="net.msmq://int01test.mydomain.com/private/queue.name" binding="netMsmqBinding"  bindingConfiguration="QueueBindingConfigurationOutbound" contract="My.Outbound.Contract" /> 



<netMsmqBinding>
<binding name="QueueBindingConfigurationOutbound">
<security>
<transport msmqAuthenticationMode="WindowsDomain" msmqProtectionLevel="Sign" />
</security>
</binding> 
</netMsmqBinding>

在测试环境中,这可以按预期工作。

测试环境中的物理设置: 服务器int01test.mydomain.com承载BizTalk服务器和我的入站队列。这在服务帐户mydomain \ inttestuser下运行。 服务器app01test.mydomain.com托管我的应用程序(IIS / AppFabric),我的数据库(SQL服务器)和我的出站队列。这在服务帐户mydomain \ apptestuser下运行。

问题

当此解决方案升级到验收测试环境时,仍会处理呼叫,但响应会被阻止,并显示错误消息:

  

System.ServiceModel.EndpointNotFoundException:发生错误   打开队列:无法识别的错误-1072824317(0xc00e0003)。该   消息无法从队列中发送或接收。确保MSMQ是   安装并运行。还要确保队列可以打开   具有所需的访问模式和授权。 ---&GT;   System.ServiceModel.MsmqException:打开时出错   queue:无法识别的错误-1072824317(0xc00e0003)。消息不能   从队列中发送或接收。确保已安装MSMQ   运行。还要确保队列可以打开   所需的访问模式和授权。

差异

在测试环境中,我的服务和我的数据库在单个服务器实例上运行。 (BizTalk Server及其队列,我的出站消息的目标,虽然在另一台服务器上) 在验收测试环境中,我的解决方案部署在两个负载平衡的服务器上,数据库位于一个单独的集群上。 还有更严格的外部防火墙规则来模仿生产环境。 即使BizTalk服务器是集群的,但我们现在正在进行机器到机器而不是集群到集群的通信。

因此,QA环境中的设置是: 服务器int01qa.mydomain.com(与int02qa.mydomain.com集群)承载BizTalk服务器和我的入站队列。这在服务帐户mydomain \ intqauser下运行。 服务器app01qa.mydomain.com(与app02qa.mydomain.com集群)托管我的应用程序(IIS / AppFabric)和我的出站队列。这在服务帐户mydomain \ appqauser下运行。 服务器db01qa.mydomain.com托管我的数据库。

我们已经尝试了什么

  • 我们已禁用远程队列上的身份验证。
  • 我们已经完全控制了我的服务运行的帐户以及每个人#34;。
  • 我们已经成功地在两台服务器之间手动发送了msmq消息。
  • 我已将我的服务配置为将响应发送到本地专用队列,同样的错误。

2 个答案:

答案 0 :(得分:2)

问题原来是MSMQ无法找到应用池用户的证书。那就是 0xc00e0003,MQ_ERROR_QUEUE_NOT_FOUND 真的是由一个人造成的 0xC00E002F,MQ_ERROR_NO_INTERNAL_USER_CERT 将安全设置更改为

<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />

已启用的消息发送。 当然,真正的解决方案不是禁用安全性,而是确保在msmq中安装应用程序池用户证书。

答案 1 :(得分:0)

我们遇到了这个问题,不想禁用身份验证。我们尝试了多种方法,但这与我们认为不存在的用户证书有关。

我们转到了客户端应用程序的应用程序池(该应用程序池通过MSMQ调用WCF端点),并将Load Profile属性更改为True。然后,该呼叫成功了。顺便说一句,将其更改回false仍然可以继续工作-大概是因为它已经解决了证书问题。