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

#c# #asp.net #mysql #message-queue

#c# #asp.net #mysql #очередь сообщений

Вопрос:

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

Я объявил 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();
        }
    }
  

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. На панели управления очередью компьютера все папки очереди дублируются!!! Что-то очень странное с вашим компьютером.

Ответ №1:

Можете ли вы сначала убедиться, что очередь существует с именем ‘ASPNETService’ в указанном ниже расположении?

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

Комментарии:

1. Можете ли вы подтвердить, что ‘ASPNETService’ существует, когда вы открываете ‘Очередь сообщений’ двойным щелчком мыши?

2. Внутри папки ‘Private Quweues’ вы должны увидеть папку ‘ASPNETService’. Если нет, вы можете создать через контекстное меню в папке Private Queues.

3. @Dorababu, разверните узел очереди сообщений, а затем ub-узел частных очередей и посмотрите, существует ваша очередь или нет. Если очередь существует, то проблема может быть связана с разрешением доступа к очереди, и вы можете изменить это, щелкнув правой кнопкой мыши -> свойства -> вкладка безопасность.

Ответ №2:

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

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

Управление компьютером -> Частные очереди -> щелкните правой кнопкой мыши имя очереди -> Свойства -> Вкладка Безопасность -> выберите «Каждый» пользователь -> установите флажок Полный контроль / Разрешить -> нажмите OK

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

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

Ответ №3:

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

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

Но я все еще ловил «Очередь не существует или у вас недостаточно разрешений для выполнения операции» при попытке Send() доступа к очереди. И я смог убедиться, что это MessageQueue.Exists(".\private$\myqueue") возвращалось true .

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

Ответ №4:

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

  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);
  

Ответ №5:

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

     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 resu<
        }
    }
   public void SendMessage()
    {
        string queuePath = QueueName;
        MessageQueue  messageQueue = MessageQueue.Create(queuePath);
        messageQueue.Send("msg");            
    }
  

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

Ответ №6:

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

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

Например, если я объявлю следующее:

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

Где «myQueue» является общедоступной очередью на сервере SOMEHOST, следующий код успешно вставляет сообщения в очередь, но всегда завершается ошибкой при получении ():

             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.100MyQueue";
  

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

Комментарии:

1. Вы когда-нибудь решали это? У нас есть сценарий, в котором работает использование реального имени компьютера. IP работает. Но использование псевдонима (например, через файл hosts) не работает.