MSMQ 的 访问方式 乱弹
Report Date
:
|
Prepared by
:
郑昀
|
Article last modified on
|
|
The information in this article applies to:
ü
Microsoft MSMQ
|
问题陈述
:
有一个网友问我,执行
IMSMQQueueInfoPtr pisQI = NULL;
HRESULT hr = pisQI.CreateInstance("MSMQ.MSMQQueueInfo");
pisQI->
PathName
= "
direct=tcp:172.xx.xx.xx\\private$\\YourMQName
";
或者
pisQI->
PathName
= "
172.xx.xx.xx\\private$\\YourMQName
";
hr = pisQI->raw_Open(MQ_SEND_ACCESS,MQ_DENY_NONE,&pisQueue);
|
都会出错,错误号是:
0xC00E0014
,
which means illegal queue pathname(
非法的路径名
)
。
但是,
MSDN
上确实是这么描述
DIRECT
语法的呀
?
为什么不能指定
IP
地址用于访问
MSMQ
队列呢?
这到底是怎么回事呢?
最开始我一直没有注意到他操作的是
PathName
属性,所以也有点困惑。
原因分析:
对于
IMSMQQueueInfo
的
PathName
这个属性,它只接受这样的语法:
"myComputer\myPublicQueue"
"otherComputer\otherPublicQueue"
"myComputer\Private$\myPrivateQueue"
".\myPublicQueue"
".\Private$\myPrivateQueue"
而不接受这样的
IP
标示:
xxx.xxx.xxx.xxx \private$\yourqname
因为并没有可供使用的语法指明这个地址是
IP
地址,所以
MS
不支持这种写法,会返回错误
MQ_ERROR_ILLEGAL_PATHNAME (C00E0014)
。
对于
FormatName
这个属性,它才接受你的各种各样
DIRECT
语法:
Direct=tcp:
MyMachineHostName \private$\yourqname
Direct=tcp:
xxx.xxx.xxx.xxx \private$\yourqname
PUBLIC=
QueueGUID
DIRECT=
Protocol
:
ComputerAddress
\
QueueName
DIRECT=OS:
ComputerName
\private$\
QueueName
PRIVATE=
ComputerGUID
\
QueueNumber
因为它可以显式指明使用的协议。
如果你不小心给
FormatName
这个属性赋值
MyMachineHostName \private$\yourqname
,那就会得到
MQ_ERROR_ILLEGAL_FORMATNAME (C00E001E)
这个错误。
同样,如果你不小心给
PathName
这个属性赋值
direct=tcp:172.xx.xx.xx\private$\YourMQName
,那就会得到
MQ_ERROR_ILLEGAL_PATHNAME (C00E0014)
这个错误。
这两个属性真的不一样啊,不要搞混了。
我的其他建议:
如果你本机的
MSMQ
安装模式是
Workgroup
模式:
只能使用
.\private$\ YourPrivateMQName
来访问本机的私有
MSMQ
队列。
而不能使用
.\ YourPublicMQName
,即本机的公用队列你无法访问,只有在
AD
模式下才可以访问公用队列。
谨慎起见,我进一步建议你不要在
FormatName
属性上使用
DIRECT
语法,因为:
MSMQ1.0
并不是完全支持
DIRECT
语法,
MSMQ2.0
才支持的。
最好用
PathName
属性。
所以,一般请这么使用
PathName
:
MyMachineHostName \ YourPublicMQName
。
除非你要在
Internet
上访问远端
MSMQ
,再使用
FormatName
属性指定对方
IP
地址。
Writen by zhengyun.NoJunk(at)tomosoft.dot.com
Disclaimers
:
本文档所包含的信息代表了在发布之日,
ZhengYun
对所讨论问题的当前看法,
Zhengyun
不保证所给信息在发布之日以后的准确性。
本文档仅供参考。对本文档中的信息,
Zhengyun
不做任何明示或默示的保证。
用户必须遵守所有适用的版权法。在不对版权法所规定的权利加以限制的情况下,如未得到
zhengyun
和
CSDN.Net
明确的书面许可,不得出于任何目的、以任何形式或手段(电子的、机械的、影印、录制等等)复制、传播本文的任何部分,也不得将其存储或引入到检索系统中。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12746