在这行代码中,我收到了错误,如我所说
我将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();
}
}
答案 0 :(得分:13)
您可以先在下面的位置验证队列是否存在名称为“ASPNETService”吗?
计算机管理 - >服务和应用 - >消息队列 - >私人队列
答案 1 :(得分: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 :(得分:2)
我有类似的问题。我很困惑,因为我的代码在我的本地开发机器上工作,但不在生产中。甚至更奇怪的是,队列的创建方式完全相同。
事实证明,IIS默认情况下无法访问它们。我只是打开了权限。
计算机管理 - >私人队列 - >右键单击队列名称 - >属性 - >安全选项卡 - >点击“所有人”用户 - >单击完全控制/允许复选框 - >单击确定
这对我来说是固定的,在我看来这不是问题,但你可能想要考虑为所有用户打开它的后果。
此外,我必须在所有服务器上的所有队列中执行此操作。似乎没有办法多选队列或文件夹,以便同时为多个队列设置权限。
答案 3 :(得分:2)
我遇到了同样的问题。
我创建了一个新的私人队列,并为每个人提供了完全权限。
但是当我尝试Send()
到队列时,我仍然在捕获“队列不存在或者您没有足够的权限来执行操作”。我能够验证MessageQueue.Exists(".\\private$\\myqueue")
是否正在返回true
。
重新启动消息队列服务解决了我的问题。
答案 4 :(得分: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);
答案 5 :(得分:0)
对于那些正在努力解决这个问题并像往常一样拉扯他们头发的人,我终于找到了一些在所有投票建议都失败的情况下有用的东西。
即使您认为正确解析了目标队列的托管系统的主机名,也不相信。尝试使用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()有效,但当我使用主机名而不是IP时,Receive()不能,但我可以一致地重现这些结果。直到我能够弄清楚名称解析发生了什么,我不再浪费一天时间尝试从队列中读取消息。