Ответ 1
Да, вам нужно, чтобы MSMQ устанавливался локально для записи в удаленную очередь. Если вы пишете в приватную очередь, посмотрите эту страницу, в которой есть полезная информация о том, как форматировать имя очереди. Если вы пишете в удаленную очередь транзакций, то вам нужно убедиться, что вы правильно это указали (пункт 5)
Это текст статьи:
1. При работе с удаленными очередями имя очереди в формате
machinename\private$\queuename
не работает. Это приводит к Ошибка недопустимого пути в очереди.2. Имя очереди должно быть указано как
FormatName:Direct=OS:machinename\\private$\\queuename
.Это необходимо, так как доступ к очереди осуществляется внутренне с использованием формата имя синтаксис только. Другое дружеское представление преобразуется в formatName, а затем используется. При работе с удаленными очередями, кроме есть AD для разрешения имени очереди, дружественное имя не будет Работа. Подробнее см. Документацию.
Например,
MessageQueue rmQ = new MessageQueue ("FormatName:Direct=OS:machinename\\private$\\queue"); rmQ.Send("sent to regular queue - Atul");
3. В дополнение к предыдущему пункту обратите внимание, что FormatName чувствителен к регистру. Если вы упомянете предыдущую строку как
FormatName:Direct=OS:machinename\\private$\\queuename
, это не будет Работа. Удивительно, но в этом случае нет ошибки. "FormatName" часть строки кажется единственным чувствительным к регистру часть. Другие могут появляться в разных случаях. Напр. Ты можешь написать "НЕПОСРЕДСТВЕННЫЙ".4. Если вы хотите использовать IP-адрес устройства, синтаксис будет
FormatName:Direct=TCP:ipaddress\\private$\\queuename
.Например,
MessageQueue rmQ = new MessageQueue ("FormatName:Direct=TCP:121.0.0.1\\private$\\queue"); rmQ.Send("sent to regular queue - Atul");
5. Транзакционные свойства экземпляра очереди, который вы создаете в коде, должны совпадать с транзакционными свойствами очереди, которую вы пытаетесь отправить сообщение. Поэтому в предыдущих примерах я отправлял сообщение не транзакционная очередь. Чтобы отправить транзакционную очередь, код будет
MessageQueue rmTxnQ = new MessageQueue ("FormatName:Direct=OS:machinename\\private$\\queue"); rmTxnQ.Send("sent to Txn queue - Atul", MessageQueueTransactionType.Single);
Если свойства транзакции не совпадают, сообщение не будет доставлен. Удивительная часть снова, я не получил никакой ошибки, и сообщение просто исчезло
6. Наконец, при отправке сообщений в удаленную очередь временная исходящая очередь создается на вашей собственной машине. Это используется в случае удаленная очередь недоступна. Если вы перейдете на компьютер Управление console (compmgmt.msc) и развернуть Службы и приложения/ Очереди сообщений/исходящих очередей, вы увидите эти очереди. правая сторона консоли должна показывать детали, включая состояние (подключен или нет) и IP-адрес для следующего скачка (ов).