作为我正在开发的应用程序的一部分,我尝试使用 Microsoft 消息队列功能并且在权限设置方面遇到了问题。
我想在服务器计算机上创建一个队列并向其发送消息,并通过本地网络从客户端计算机访问它。两台计算机(均为 Windows 7 家庭高级版)位于同一个 LAN 网络上,并且能够相互 ping 通。我会知道创建队列的确切路径,所以我猜私有队列是可以的。
我的代码基于此示例,并使用 IronPython从 System.Messaging 命名空间 访问MessageQueue 类。示例中的发送和接收设置用于创建队列并在一个控制台中向其发送消息:
>>> localQueue = MessageQueue.Create('.\\private$\\testQueue')
>>> localQueue.FormatName
'DIRECT=OS:<clientMachineName>\\private$\\testQueue'
>>> localQueue.Send('hello from other console')
然后通过以下代码访问队列并在另一个控制台中查看它:
>>> SemiRemoteQueue = MessageQueue('FormatName:Direct=OS:<clientMachineName>\\private$\\testQueue')
>>> SemiRemoteQueue.Peek()
<System.Messaging.Message object at 0x000000000000002F [System.Messaging.Message
]>
当我在服务器计算机上创建一个新队列时,我似乎能够与客户端计算机建立连接,但无法从中获取任何消息数据。从客户端查看在服务器上创建的队列,会出现以下“拒绝访问”错误消息:
>>> ReallyRemoteQueue = MessageQueue('FormatName:Direct=OS:<serverMachineName>\\private$\\remoteTestQueue')
>>> ReallyRemoteQueue.Peek()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
EnvironmentError: System.Messaging.MessageQueueException (0x80004005): Access to
Message Queuing system is denied.
at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
at System.Messaging.MessageQueue.StaleSafeReceiveMessage(UInt32 timeout, Int3
2 action, MQPROPS properties, NativeOverlapped* overlapped, ReceiveCallback rece
iveCallback, CursorHandle cursorHandle, IntPtr transaction)
at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 actio
n, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction in
ternalTransaction, MessageQueueTransactionType transactionType)
at System.Messaging.MessageQueue.Peek()
at Microsoft.Scripting.Interpreter.FuncCallInstruction`2.Run(InterpretedFrame
frame)
at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
at Microsoft.Scripting.Interpreter.LightLambda.Run3[T0,T1,T2,TRet](T0 arg0, T
1 arg1, T2 arg2)
at IronPython.Compiler.Ast.CallExpression.Invoke0Instruction.Run(InterpretedF
rame frame)
at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 a
rg1)
at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
at IronPython.Hosting.PythonCommandLine.<>c__DisplayClass1.<RunOneInteraction
>b__0()
我发现应该可以访问远程私有 MSMQ 队列,但不知道如何设置正确的权限。我在防火墙设置中允许 MSMQ,甚至尝试关闭防火墙。发现了一些关于将权限设置应用于队列文件的讨论,但这无济于事,因为我没有具有适用于它们的安全设置的队列文件。我没有像建议的那样尝试完全访问“匿名登录”的选项,但最终希望以编程方式(在代码中)设置权限,而不是在文件的上下文菜单中。我应该在 MessageQueing 类 (http://msdn.microsoft.com/en-us/library/dd48yz36(v=vs.80)) 中使用 SetPermissions 方法吗?如何指定它的参数?
感谢您的任何建议!