在安装MSMQ的时候出现“MSMQ客户端安装失败,不能启动MSMQ服务”,在网上找了一下,具体都是msdtc的服务重装,但是在自己的xp系统上重装了也没有,继续搜索,找到了一篇“Error 0x42c when you try to install MSMQ”,主要看到了xp中msmq的相关服务需要开启,如下:

 

Windows XP

  • Distributed Transaction Coordinator
  • Message Queuing access control
  • NT LM Security Support Provider
  • Reliable Multicast Protocol Driver
  • Remote Procedure Call (RPC)
  • Security Accounts Manager

仔细看了下自己的xp服务发现有几个服务根本就没有,于是放弃了在xp上装msmq的想法,直接换成2003系统安装即可。但是在过程中找了一个关于“在msmq3.0中使用http协议发送消息”的博文,这里给转载一下:

 


1.先声明:
msmq3.0仅在winxp和win2003以上系统支持,如果windows vista系统,据说已经开始支持msmq4.0了

2.为什么要使用http协议发送消息
访问internet远程发送消息时,msmq2.0以上就已经开始支持tcp方式了,但是如果外网的服务器与发送端之间有防火墙或其它网络设备隔离,或者服务器上的tcp所需要的端口未开放,tcp方式将无法发送,而http协议使用的是默认的80端口,一般服务器都会开放这一端口,另外只有http协议可以穿透防火墙

3.msmq3.0的安装问题
在windows xp上安装消息队列时,默认情况下msmq已经安装了http协议支持,而windows2003上,默认安装的消息队列是没有http支持的,需要在"添加/删除 windows组件"-->"应用程序服务器"-->"消息队列"-->"详细信息"中把"MSMQ http支持"勾中

另外要说明的是msmq3.0在安装过程中,需要在iis的默认站点(即标识为W3WVC1,msmq在安装中定死了这一标识)中创建msmq的虚拟目录,如果你不幸把iis的默认站点删除了,就无法正确安装msmq3.0的http支持(既使你再新建一个默认站点也没用,因为新建的站点,其内部元数据标识是随机生成的,不是W3WVC1),会提供以下错误: /LM/W3Svc/1/Root/MSMQ 找不到之类

解决办法:
(a)把iis卸载掉,重新安装iis,当然重安装iis后,很多iis的站点信息也将丢失
(b)修改iis元数据
先到http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&DisplayLang=en 这里下载一个Internet Information Services (IIS) 6.0 Resource Kit Tools 安装后运行

程序-->IIS Resources--> Metabase Explorer --> Metabase Explorer

展开/LM/W3SVC/节点,找到你当前的默认站点标识名(技巧:在iis管理中,右击默认站点-->属性-->网站-->属性-->在弹出对话框最下面的日志文件名W3SVC1529656452/exyymmdd.log,这里的1529656452就是内部标识)

修改以下几个地方:
先把这个标识rename为1,再修改这个节点下面的root以及虚拟目录的AppRoot,即把类似/LM/W3SVC/1529656452/Root 修改为/LM/W3SVC/1/Root

保存,然后重启iis服务,就能正常安装msmq3.0的http支持了(这个技巧我搜索遍了google,baidu也没找到,最终自己尝试发现的!)

4.发送代码示例:
代码其实很简单

 

MessageQueue mq = new MessageQueue("FormatName:DIRECT=http://172.134.54.4/msmq/Private$/demo");
System.Messaging.Message msg = new System.Messaging.Message();
msg.Body = "Hello World!" + DateTime.Now.ToString();
msg.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) });
mq.Send(msg);

如果172.134.54.4这台服务器是直接对外公开访问的,以上代码就可以将消息正常发送到该服务器的专用队列demo上

5.如何穿透防火墙,路由等障碍
微软有一篇专门文章讲解这个,主要是设置服务器端的C:/WINDOWS/system32/msmq/mapping/sample_map.xml这个文件,详情可参见:
http://www.microsoft.com/china/windowsserver2003/techinfo/overview/msmqb2b.mspx