轉:http://m.blog.csdn.net/blog/2000killer/8904852
最近項目中需要跨服務器對消息隊列進行讀寫,開始在單獨開發機器上進行Queue的讀寫沒問題。但是部署后,在服務器上創建的Queue開發者的 機器只能寫數據而不能讀數據。.net給出的錯誤是“對消息隊列系統的訪問被拒絕”,也就是說拒絕訪問隊列沒有相關權限,我給Everyone和 ANONYMOUS LOGON賦予全部權限都無法解決(正常情況下可以解決此問題)。經過多次google和嘗試現將解決辦法匯總如下:
一. 服務部署情況說明
1. 在window 2008r2開發服務器上安裝並創建消息隊列
2. 在window 7開發者機器上向開發服務的消息隊列讀寫數據
二. 問題解決辦法
1. 服務器端
- 服務器上消息隊列權限設置:給ANONYMOUS LOGON賦予所有權限;
- 修改服務器的注冊表,允許非驗證客戶端訪問
- 注冊表新增HKLM\Software\Microsoft\MSMQ\Parameters\security\AllowNonauthenticatedRpc項,設置其DWORD值為1
- 注冊表新增HKLM\Software\Microsoft\MSMQ\Parameters\security\NewRemoteReadServerDenyWorkgroupClient項,設置其DWORD值為1
MSMQ的安全訪問控制說明參見:http://msdn.microsoft.com/en-us/library/4108f68e-80f5-40e1-b3df-b713cc4dff79(prot.20).aspx
2. 開發 端
設置消息隊列路徑為:
隊列示例代碼如下:
public static class MsmqQueue { private static MessageQueue queue = null; static MsmqQueue() { queue = new MessageQueue(@"Formatname:DIRECT=tcp:192.168.1.200\private$\OrgMngUserOprtLog"); } public static void SendMessage(DTO message) { Message msg = new Message { Body = message, Formatter = new XmlMessageFormatter(new Type[] { typeof(DTO) }) }; queue.Send(msg); } public static void ReceiveMessage() { queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(DTO) }); Message msg = queue.Receive(); var ret = msg.Body as DTO; } public static void Close() { queue.Close(); queue.Dispose(); } }