发送到DNS别名的MSMQ消息到127.0.0.1,最后是传出队列而不是本地队列

时间:2014-11-28 01:11:58

标签: dns msmq msmqintegrationbinding

我正在使用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项。

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

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

要通过DNS解析,请使用DNS名称而不是IP:

FORMATNAME:Direct=OS:CRM_SERVER\crmintegration

正如您在问题中所述,在MSMQ客户端上设置IgnoreOSNameValidation参数(您的preprod计算机同时是客户端和服务器)非常重要(按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