我正在使用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可以正常工作。
我错过了什么吗?
答案 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