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
最后特别感谢我的网友yongfeng,在调试过程中是他给我很多帮助。