2011-05-02 25 views
6

En esta línea de código que estoy recibiendo el error como he mencionadoMessage Queue Excepción: Cola no existe o no tiene permisos suficientes para realizar la operación

declaré MSMQ_NAME como cadena de la siguiente manera

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

+2

En el panel de espera de Administración de equipos, todas las carpetas de cola están duplicadas. Algo es muy extraño con su máquina. –

Respuesta

11

se puede verificar primero la cola está existiendo con el nombre 'ASPNETService' en la ubicación de abajo?

Administración de equipos -> Servicios y Aplicaciones -> Message Queue -> Colas privadas

+0

¿Puede verificar mi actualización? – Dotnet

+0

¿Puede verificar que exista 'ASPNETService' cuando abre 'Message Queuing' haciendo doble clic? –

+1

Dentro de la carpeta 'Private Quweues', debería ver la carpeta 'ASPNETService'. De lo contrario, puede crearlo a través del menú contextual en la carpeta Colas privadas. –

2

que estaba enfrentando el mismo problema, yo había resuelto utilizando la siguiente clase para crear la cola

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

Crear mensaje cola de la misma manera para recibir el mensaje.

2

Tuve un problema similar. Estaba confundido porque mi código funcionaba en mi máquina de desarrollo local, pero no en producción. Aún más extraño, las colas se crearon de la misma manera.

Resulta que IIS no tiene acceso a ellos de forma predeterminada. Acabo de abrir los permisos.

Computer Management -> Private Queues -> right-click queue name -> Properties -> Security Tab -> click "Everyone" user -> click Full Control/Allow checkbox -> click OK

que esto esté arreglado para mí, y en mi caso no es un problema, pero es posible que desee pensar en las ramificaciones de simplemente abrirlo para todos los usuarios.

Además, tuve que hacer esto en todas las colas en todos los servidores. No parece haber una forma de seleccionar múltiples colas o carpetas para establecer permisos para múltiples colas simultáneamente.

2

Estaba teniendo el mismo problema.

Creé una nueva cola privada y otorgué Permiso total a todos.

Pero todavía estaba detectando una "Cola no existe o no tienes suficientes permisos para realizar la operación" al intentar Send() en la cola. Y pude verificar que MessageQueue.Exists(".\\private$\\myqueue") estaba devolviendo true.

Al reiniciar el servicio Message Queue Server resolví mi problema.

1

Tuve el mismo problema y me gustó más abajo donde comprobé si la cola existe o no. Si es así enviar el mensaje otra cola de crear y luego enviar mensaje

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

Para otros que luchan con esto y tiran de los pelos como si hubiera sido, por fin encontré algo que funciona cuando todas las sugerencias upvoted fallidos.

Incluso si cree que el nombre de host del sistema de alojamiento de la cola de destino se está resolviendo correctamente, no lo crea. Intente reemplazar el nombre de host con una dirección IP y vea si funciona. Lo hace por miPuedo ESCRIBIR a una cola pública utilizando un nombre de host en mi servidor remoto sin problemas, pero tratar de LEER de él produce exactamente el error enumerado para esta pregunta.

Por ejemplo, si declaro lo siguiente:

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

Donde "MyQueue" es una cola pública en somehost servidor, el siguiente código se inserte con éxito mensajes a la cola, pero siempre falla en la recepción ():

  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 
     } 

Un simple cambio en la forma en que especifique la ubicación de la cola es todo lo que se necesita para hacer la recepción() deje de fallar con el temido "cola no existe o no tiene permisos suficientes" error:

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

(Obviamente he ofuscado las direcciones IP y otra información confidencial). El uso de la dirección IP no es obviamente un escenario digno de producción, pero me señaló algún tipo de problema de resolución de nombres como la posible causa del error. No puedo explicar por qué Send() funciona, pero Receive() no lo hace cuando utilizo un nombre de host en lugar de IP, pero puedo reproducir estos resultados de forma coherente. Hasta que sepa qué está pasando con la resolución del nombre, ya no estoy perdiendo un día tratando de leer los mensajes de una cola.

Cuestiones relacionadas