0

我正在使用 msmqIntegrationBinding 将消息发送到旧版 MSMQ。我希望能够在 preprod 中使用与生产中相同的配置文件,但在 preprod 中,遗留队列是本地的,而生产队列在另一台服务器上。

我以为我可以使用 DNS 别名来做到这一点。

我已在我的 preprod 服务器上的 HOSTS 文件中将 DNS 别名设置为 127.0.0.1

127.0.0.1 CRM_SERVER

我已将客户端中的端点配置为使用 DNS 别名的 DIRECT OS 格式名

 <endpoint name="LegacyMsmqService" 
           address="msmq.formatname:DIRECT=OS:CRM_SERVER\crmintegration" 
           binding="msmqIntegrationBinding" 
           contract="Integration.Facades.ILegacyMsmqService" 
           bindingConfiguration="msmqIntegrationBinding"/>

我已将HKEY_LOCAL_MACHINE\Software\Microsoft\MSMQ\Parameters\IgnoreOSNameValidation注册表项设置为 1,并且我什至添加CRM_SERVER了该项HKEY_Local_Machine\System\CurrentControlSet\Services\LanmanServer\Parameters\OptionalNames

我已经重启了至少十几次!

每当我的客户端向队列发送消息时,它都会在传出队列上结束,而不是在本地队列上。使用正确的机器名称或本地主机可以正常工作。

我错过了什么吗?

4

1 回答 1

0

要通过 DNS 解析,请以这种方式使用 DNS 名称而不是 IP:

FORMATNAME:Direct=OS:CRM_SERVER\crmintegration

正如您在问题中指出的那样,在 MSMQ 客户端(您的 preprod 机器既是客户端又是服务器)上设置 IgnoreOSNameValidation 参数很重要(根据http://support.microsoft.com/kb/306785)。这是执行此操作的命令行方法:

reg.exe ADD HKLM\Software\Microsoft\MSMQ\Parameters /V IgnoreOSNameValidation /t REG_DWORD /d 1 /f

或者,如果您愿意,可以通过 powershell:

Set-ItemProperty -Path HKLM:\Software\Microsoft\MSMQ\Parameters -Name IgnoreOSNameValidation -Value 1

注意:插入到 QUEUE 条目中可以使用格式名称中的 TCP 协议进行解析——但是对于从队列中读取,您不能使用 TCP(回想一下 MSMQ 是旧技术):

FORMATNAME:Direct=TCP:CRM_SERVER\crmintegration
于 2015-06-12T16:37:01.023 回答