MSMQ 跨服务器读写队列的“消息队列系统的访问被拒绝”的解决方案

来源:互联网 发布:中级数据库工程师真题 编辑:程序博客网 时间:2024/06/05 15:05

         最近项目中需要跨服务器对消息队列进行读写,开始在单独开发机器上进行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();        }    }

原创粉丝点击