[英]WCF - MSMQ endpoint not found in new environment
我在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。 还要确保可以使用所需的访问模式和授权打开队列。 ---> 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找不到应用程序池用户的证书。 也就是说,0xc00e0003,MQ_ERROR_QUEUE_NOT_FOUND确实是由0xC00E002F引起的,MQ_ERROR_NO_INTERNAL_USER_CERT将安全设置更改为
<transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
已启用的消息将被发送。 当然,真正的解决方案不是禁用安全性,而是确保在msmq中安装应用程序池用户证书。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.