Исключение очереди сообщений: очередь не существует или у вас недостаточно разрешений для выполнения операции

в этой строке кода я получаю ошибку, как я уже упоминал

Я объявил MSMQ_NAME как строку следующим образом

  private const string MSMQ_NAME = ".private$ASPNETService";

    private void DoSomeMSMQStuff()
    {
        using (MessageQueue queue = new MessageQueue(MSMQ_NAME))
        {
            queue.Send(DateTime.Now); //Exception raises
            queue.Close();
        }
    }

enter image description here

enter image description here

6 ответов


можно сначала проверить очередь существующий с ASPNETService имя на ниже место?

Управление компьютером -> службы и приложения -> очередь сообщений -> частные очереди


У меня была похожая проблема. Я был смущен, потому что мой код работал на моем локальном компьютере, но не на производстве. Еще более странно, что очереди создавались точно так же.

оказывается, что IIS по умолчанию не имеет к ним доступа. Я только что открыл разрешения.

Управление компьютером - > частные очереди- > щелкните правой кнопкой мыши имя очереди - > свойства - > вкладка Безопасность - > нажмите" Все " пользователь - > нажмите полный контроль/разрешить флажок -> нажмите OK

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

кроме того, мне пришлось сделать это во всех очередях на всех серверах. Кажется, что нет способа выбрать несколько очередей или папок, чтобы установить разрешения для нескольких очередей одновременно.


у меня была та же проблема.

Я создал новую частную очередь и дал полное разрешение всем.

но я все еще ловил "очередь не существует или у вас нет достаточных разрешений для выполнения операции" при попытке Send() в очередь. И я смог это проверить!--1--> возвращается true.

перезапуск службы очереди сообщений решил мою проблему для меня.


я столкнулся с той же проблемой, я решил ее, используя следующий класс для создания очереди

    private MessageQueue messageQueue;
    public const string DEFAULT_QUEUE_NAME = "newQueue";
    public const string QUEUENAME_PREFIX = ".\Private$\";

    public static string QueueName
    {
        get
        {
            string result = string.Format("{0}{1}", QUEUENAME_PREFIX, DEFAULT_QUEUE_NAME);
            return result;
        }
    }
   public void SendMessage()
    {
        string queuePath = QueueName;
        MessageQueue  messageQueue = MessageQueue.Create(queuePath);
        messageQueue.Send("msg");            
    }

создать очередь сообщений таким же образом, для получения сообщения.


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

 MessageQueue msgQueue = null;
        string queuePath = ".\Private$\billpay";

        Payment newPayment = new Payment()
        {
            Payee = txtPayee.Text,
            Payor = txtPayor.Text,
            Amount = Convert.ToInt32(txtAmount.Text),
            DueDate = dpDueDate.SelectedDate.Value.ToShortDateString()
        };

        Message msg = new Message();
        msg.Body = newPayment;
        msg.Label = "Gopala - Learning Message Queue";


        if (MessageQueue.Exists(queuePath) == false)
        {
            //Queue doesnot exist so create it
            msgQueue = MessageQueue.Create(queuePath);
        }
        else
        {
            msgQueue = new MessageQueue(queuePath);
        }            
        msgQueue.Send(msg);

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

даже если вы считаете, что имя хоста хостинговой системы вашей целевой очереди решается правильно,не верю. Попробуйте заменить имя хоста IP-адресом и посмотреть, работает ли он. Для меня-да. Я могу писать в общедоступную очередь, используя имя хоста на моем удаленном сервере без проблем, но попытка прочитать из него приводит именно к ошибке, указанной для этого вопроса.

например, если я заявляю следующее:

private static string QueueName = @"FormatName:DIRECT=TCP:SOMEHOST\MyQueue";
private static System.Messaging.MessageQueue Queue = new System.Messaging.MessageQueue(QueueName);

где "MyQueue" является публичной очередью на сервере SOMEHOST, следующий код будет успешно вставлять сообщения в очередь, но всегда терпит неудачу на Receive ():

            Queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });

        // The Receive() call here is a blocking call.  We'll wait if there is no message in the queue, and processing
        // is halted until there IS a message in the queue.
        //
        try
        {
            Queue.Send("hello world", System.Messaging.MessageQueueTransactionType.Single);

            var msg = Queue.Receive(MessageQueueTransactionType.Single);

        }
        catch (Exception ex)
        {
            // todo error handling
        }

одно простое изменение в том, как я указываю местоположение очереди-это все, что нужно, чтобы заставить Receive () прекратить сбой с ужасной " очередью не существует или у вас недостаточно разрешений " ошибка:

private static string QueueName = @"FormatName:DIRECT=TCP:192.168.1.100\MyQueue";

(очевидно, я запутал IP-адреса и другую конфиденциальную информацию). Использование IP-адреса, очевидно, не является сценарием, достойным производства, но он указал мне на некоторую проблему разрешения имен как возможную причину ошибки. Я не могу объяснить, почему Send() работает, но Receive () не работает, когда я использую имя хоста вместо IP, но я могу воспроизводить эти результаты последовательно. Пока я не пойму, что происходит. с разрешением имен я больше не трачу день на чтение сообщений из очереди.