【问题标题】:Using multicast queues in System.Messaging and MSMQ 3.0在 System.Messaging 和 MSMQ 3.0 中使用多播队列
【发布时间】:2012-01-25 04:18:51
【问题描述】:

我正在尝试使用 MessageQueues 通知用户使用多播功能的数据更改应用程序,但无法使其工作:发送消息的工作站确实收到了它,但似乎没有其他正在运行的工作站捕获发送的消息。

发送消息如下:

Dim sendQueue As New Messaging.MessageQueue("FormatName:MULTICAST=234.1.1.1:8001")
Dim message As New Messaging.Message("message body...")
sendQueue.Send(message)

并接收它们:

Dim receiveQueue As New Messaging.MessageQueue(".\private$\myQ")
receiveQueue.MulticastAddress = "234.1.1.1:8001"
receiveQueue.BeginReceive()

AddHandler receiveQueue.ReceiveCompleted, Sub(sender As Object, e As Messaging.ReceiveCompletedEventArgs)
    ' ... handle message
    receiveQueue.BeginReceive()
End Sub

所以我显然遗漏了一些东西,而且我似乎找不到任何关于在 .NET 中使用 MSMQ 3.0 进行多播的好的资源。

另外,我是否应该为每个工作站使用一个本地队列,还是应该在服务器上使用一个远程队列来多播消息,尚不清楚?并且对多播消息使用接收方法是否会将它们从队列中清除?

任何帮助、提示、提示、建议、任何东西......都将受到欢迎。

附带说明,所有工作站都在同一个子网上,并且都安装了 MSMQ 3.0。

最后一句话

谢谢笔记本电脑的帮助。这个问题实际上与我在使用 COM 对象测试您的解决方案时发现的权限有关:

尽管队列属性对话框说了什么,权限不会在未经身份验证的队列上被完全忽略,至少在使用多播时是这样。如果您希望您的队列接收多播消息,它必须授予“ANONYMOUS_LOGON”“发送消息”的权利。否则,多播消息将被丢弃,而不会在事件日志或任何内容中发出任何通知(除非我错过了什么)。

在 Win7 站(XP 站似乎做得很好,这是我指出实际问题的原因),通过代码创建的队列没有这样的权限,因此必须在创建队列后手动设置:

Dim msgQ = Messaging.MessageQueue.Create(queueName)
msgQ.SetPermissions("ANONYMOUS LOGON",
                    Messaging.MessageQueueAccessRights.WriteMessage)

似乎在内部,MSMQ 使用该帐户将多播消息写入未经身份验证的队列。

【问题讨论】:

  • 另外,限制网络表明所有消息都在多播地址上正确发送...但似乎由于某种原因,与多播地址关联的队列没有收到发送的消息。
  • 您是否将“\private$\myQ”设置为非事务性队列。 MSMQ 3.0 多播功能仅适用于非事务性队列。
  • 是的,我只是仔细检查了一遍。总结一下: * 每台机器只启用了一个 NIC(以确保这与绑定 IP 问题无关),并且所有机器都在同一个子网中 * 所有工作站上都​​禁用了防火墙 * 每个本地队列都是非事务性的,并归活跃用户所有。每个队列还将其多播属性设置为帖子中提到的地址。 * 消息确实被发送(通过监控传出队列和网络流量检查),它们只是没有到达任何其他队列
  • 澄清一下,发送机器也有一个订阅多播地址的本地队列,并且发送的消息到达该队列,是吗?这表明消息正在以应该传递的方式成功发送。如果是这样,那么这不是编程问题。您提到网络捕获显示流量 - 您是在发送方还是在另一台机器(最好是后者)上捕获?
  • 是的,没错,但消息从未进入任何队列,即使是发送机器上的队列。这实际上是一个权限问题...请参阅我的原始问题以进行修复...

标签: .net vb.net msmq


【解决方案1】:

能否创建 MSMQDestination 类并为其分配多播格式,设置消息标签并使用 MSMQMessage 类执行发送任务

Dim dest As New MSMQDestination
dest.FormatName = "MULTICAST=234.1.1.1:8001"

Dim message As MSMQMessage
message.label ="Test Message"
message.Send DestinationQueue:=dest

最后的更新 我很高兴你现在松了一口气。对于您在其他机器上的问题,这是防止拒绝服务攻击的安全增强。 default msmq queue permission changed in msmq 4.0

【讨论】:

    猜你喜欢
    • 2010-11-21
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2014-05-20
    相关资源
    最近更新 更多