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,在調試過程中是他給我很多幫助。
注:轉載請注意文章出處
菩提樹下的楊過(http://blog.sqlsky.com/)整理