2011-05-02 69 views
6

在這行代碼正如我所提到消息隊列異常:隊列不存在,或者您沒有足夠的權限來執行該操作

我得到的錯誤,我宣佈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

+2

在計算機管理隊列面板中,所有隊列文件夾都是重複的!你的機器有點奇怪。 – 2011-05-02 09:05:29

回答

11

可以先驗證隊列與名稱的現有 'ASPNETService'在下面的位置?

計算機管理 - >服務和應用程序 - >消息隊列 - >專用隊列

+0

你可以檢查我的更新請 – Dotnet 2011-05-02 08:55:50

+0

當你通過雙擊打開'消息隊列'時,你能驗證'ASPNETService'嗎? – 2011-05-02 09:00:44

+1

在「Private Quweues」文件夾中,您應該看到「ASPNETService」文件夾。如果沒有,您可以通過上下文菜單在Private Queues文件夾中創建。 – 2011-05-02 09:04:11

2

我面臨同樣的問題,我一直在使用下面的類來創建隊列

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

新建信息解決它以相同的方式排隊接收消息。

2

我有類似的問題。我很困惑,因爲我的代碼在本地開發機器上工作,但不在生產中。即使是陌生人,隊列也是以完全相同的方式創建的。

事實證明,IIS默認無法訪問它們。我只是打開了權限。

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

這種固定對我來說,在我的情況下,它不是一個問題,但你可能要考慮剛剛打開它爲所有用戶所帶來的後果。

此外,我必須在所有服務器上的所有隊列中執行此操作。似乎沒有辦法通過多選隊列或文件夾來同時爲多個隊列設置權限。

2

我遇到了同樣的問題。

我已經創建了一個新的專用隊列並給予每個人完全權限。

但是當我嘗試Send()到隊列時,我仍然在捕捉「隊列不存在或者您沒有足夠的權限執行操作」。我能夠驗證MessageQueue.Exists(".\\private$\\myqueue")正在返回true

重新啓動消息隊列服務爲我解決了我的問題。

1

我有同樣的問題,我喜歡下面,我檢查隊列是否存在。如果是發送短信別人創建的隊列,然後發送消息

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

對於其他與此掙扎,拉扯自己的頭髮,這樣我一直,我終於找到了當所有的upvoted的建議失敗的作品。

即使您認爲目標隊列的主機系統的主機名已被正確解析,也不相信它。嘗試用IP地址替換主機名並查看它是否有效。它爲我做。我可以使用遠程服務器上的主機名毫無問題地寫入公共隊列,但嘗試從它讀取時會產生與此問題相關的錯誤。

例如,如果我聲明如下:

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

其中「myQueue中」是在服務器上,某一個公共隊列,下面的代碼將成功消息插入到隊列中,但總是失敗的接收( ):

  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 
     } 

在我如何指定隊列位置的一個簡單的變化是所有的需要,使接收()停止與可怕的失敗「隊列不存在,或者您沒有足夠的權限」錯誤:

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

(很明顯我混淆了IP地址和其他敏感信息)。使用IP地址顯然不是一個值得生產的場景,但它確實指出某種類型的名稱解析問題是錯誤的可能原因。我無法解釋爲什麼Send()能夠工作,但Receive()不會在我使用主機名而不是IP時使用,但我可以一致地重現這些結果。在我能夠弄清楚名稱解析發生了什麼之前,我不再浪費一天的時間來閱讀隊列中的消息。

相關問題