Использование многоадресных очередей в System.Messaging и MSMQ 3.0 - PullRequest
7 голосов
/ 21 декабря 2011

Я пытаюсь использовать 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

Так что я явно что-то упускаю, и я не могу найти хороших ресурсов по многоадресной рассылке с MSMQ 3.0 в .NET.

Кроме того, неясно, должен ли я использовать локальную очередь на рабочую станцию ​​или одну удаленную очередь на сервере для многоадресной рассылки сообщений? И удаляет ли использование метода приема для многоадресных сообщений их из очереди?

Любая помощь, советы, подсказки, все, что угодно ... будет приветствоваться.

Кстати, все рабочие станции находятся в одной подсети, и на всех установлен MSMQ 3.0.

Последнее слово

Хорошо, спасибо ноутбук за помощь. На самом деле проблема была связана с разрешениями, которые я обнаружил при тестировании вашего решения с COM-объектами:

Несмотря на то, что говорит диалоговое окно свойств очереди, разрешения НЕ полностью игнорируются в неподтвержденных очередях, по крайней мере при использовании многоадресной рассылки . Если вы хотите, чтобы ваша очередь получала многоадресные сообщения, она должна предоставить ANONYMOUS_LOGON право «Отправлять сообщения». В противном случае многоадресные сообщения просто отбрасываются без какого-либо уведомления в журналах событий или чего-либо еще (если я что-то пропустил).

На станциях Win7 (кажется, что со станциями XP все в порядке, что и указывает на реальную проблему), очереди, созданные с помощью кода, не имеют таких разрешений и, следовательно, должны быть установлены вручную после создания очереди:

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

Может показаться, что внутри MSMQ использует эту учетную запись для записи многоадресных сообщений в неаутентифицированные очереди.

1 Ответ

2 голосов
/ 21 декабря 2011

Не могли бы вы создать класс 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

ФИНАЛЬНОЕ ОБНОВЛЕНИЕ СЛОВА Я рад, что вы облегчение сейчас. для вашей проблемы на другом компьютере, это повышение безопасности для предотвращения атаки типа «отказ в обслуживании». изменено разрешение очереди msmq по умолчанию в msmq 4.0

...