C# 通过主机文件连接到远程队列

C# 通过主机文件连接到远程队列,c#,security,configuration,msmq,C#,Security,Configuration,Msmq,我的应用程序有不同的环境(Dev->Test->Prod),我使用的是MSMQ 我还有通过配置文件使用的队列(它们是远程队列)的名称,格式如下: FormatName:Direct=SERVER_NAME\Private$\MY_QUEUE 我的问题是,服务器名称在不同的环境中是不同的,我希望将该问题委托给服务器(即:对于数据库,我在所有3台服务器中都有同名的别名,它们都指向实际的db服务器) 我尝试将队列服务器添加到主机文件,但失败,错误如下: 队列不存在,或者您没有足够的权限执行该操作 我

我的应用程序有不同的环境(Dev->Test->Prod),我使用的是MSMQ

我还有通过配置文件使用的队列(它们是远程队列)的名称,格式如下:

FormatName:Direct=SERVER_NAME\Private$\MY_QUEUE
我的问题是,服务器名称在不同的环境中是不同的,我希望将该问题委托给服务器(即:对于数据库,我在所有3台服务器中都有同名的别名,它们都指向实际的db服务器)

我尝试将队列服务器添加到主机文件,但失败,错误如下:

队列不存在,或者您没有足够的权限执行该操作

我尝试了
FormatName:Direct
FormatName:OS
,以及
FormatName:TCP

任何帮助(解决方法、新想法、如何使其发挥作用)都将不胜感激


目标是拥有一个可在所有环境中使用的配置文件。

指定的格式名无效。应该是:

FormatName:Direct=OS:SERVER_NAME\Private$\MY_QUEUE
或者,如果您想改用IP地址:

FormatName:Direct=TCP:XXX.XXX.XXX.XXX\Private$\MY_QUEUE

这只是一个猜测,目前我无法证实这一点,但是:

失败的原因是msmq使用kerberos身份验证。验证交换双方的身份。你方正在使用“错误”的名称访问服务器。因此,当服务器尝试与您(客户端)进行身份验证时。Windows可以“告诉”这不是您要找的服务器。因此,它无法通过身份验证


可能有一些方法可以避免这种情况。但这将危及安全。我建议将目标服务器的三个名称(dev、qa和production)放在配置文件中。并使用一些参数(如域名、用户名、计算机名或其他类似参数)在它们之间进行选择,这些参数在不同的环境中也是不同的。

我们也在我们的环境中使用主机文件,但发现(困难的)MSMQ不支持它。
我们的解决方案是在MSMQ上使用抽象层(ITransport),并让该层用ip地址替换主机名(可能在主机文件中找到)。使用。

有趣的建议很容易完成。我没有想到这一点。很好,我可以用Dns类读取字符串,用ip替换连接到队列的字符串!