3

设置

我在 Windows Server 2012R2 上运行的 IIS/AppFabric 中托管了 WCF 服务。该服务通过 netMsmqBinding 绑定到本地事务性 MSMQ 队列。我的操作用 TransactionScopeRequired = true 修饰。服务操作接收来自 BizTalk 服务器的调用,处理它们并将响应发送回远程队列(在同一 BizTalk 服务器上),也通过 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 已安装并正在运行。还要确保可以使用所需的访问模式和授权打开队列。---> System.ServiceModel.MsmqException:打开队列时出错:无法识别的错误-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 托管我的数据库。

我们已经尝试过的

  • 我们已禁用远程队列上的身份验证。
  • 我们已授予运行我的服务的帐户以及“所有人”的完全控制权。
  • 我们已经成功地在两台服务器之间手动发送了 msmq 消息。
  • 我已将我的服务配置为向本地私有队列发送响应,同样的错误。
4

2 回答 2

2

问题原来是 MSMQ 找不到应用程序池用户的证书。也就是说,0xc00e0003, MQ_ERROR_QUEUE_NOT_FOUND 确实是由 0xC00E002F, MQ_ERROR_NO_INTERNAL_USER_CERT 将安全设置更改为

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

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

于 2016-06-10T09:09:29.447 回答
0

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

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

于 2019-09-20T14:24:20.413 回答