无法判断是否存在指定格式名的队列执行以下代码时出现异常。任何想法出了什么问题?stringqueueName="FormatName:Direct=TCP:1.1.1.1\Private$\test";MessageQueue队列;如果(MessageQueue.Exists(queueName))queue=newSystem.Messaging.MessageQueue(queueName);elsequeue=MessageQueue.Create(queueName);queue.Send(sWriter.ToString());编辑:这是异常消息和堆栈跟踪的第一行无法确定是否存在具有指定格式名称的队列。在System.Messaging.MessageQueue.Exists(Stringpath)顺便说一句,它适用于本地队列。从您的示例来看,您似乎正在尝试检查远程专用队列是否存在,但正如MessageQueue.Exists文档所述:无法调用Exists来验证远程专用队列是否存在。尝试这样做将生成InvalidOperationException。如果您的工作流确实需要此信息,您可以使用MessageQueue.GetPrivateQueuesByMachineMessageQueue.GetPrivateQueuesByMachine方法并遍历结果以找到匹配项。如果你这样做,我建议阅读远程MSMQ队列可靠吗?,其中稍微讨论了这种方法。优秀的“管道工伙伴的MSMQ”博客中的这篇帖子提出了另一种选择:甚至不检查您的队列是否存在,“但如果发现队列不存在,则处理未传递的消息。”(您需要跟踪管理队列和/或死信队列,但无论如何您都应该这样做。)试试这个...publicstaticboolIsQueueAvailable(stringqueueName){varqueue=newMessageQueue(queueName);尝试{queue.Peek(newTimeSpan(0,0,5));返回真;}catch(MessageQueueExceptionex){returnex.Message.StartsWith("超时");如果队列不存在或运行应用程序的帐户没有足够的权限访问它,异常消息将明确说明。而且,这将适用于FormatName和通常的队列路径。上面检查异常消息的答案是针对英文抛出异常的系统。我的系统抛出荷兰语异常。我得到“detime-outvoordegevraagdebewerkingisverstreken”。所以这不是一个非常可靠的解决方案异常有一个属性MessageQueueErrorCode应该用来检查是否发生了IOTimeout。所以最好使用return(ex.MessageQueueErrorCode==MessageQueueErrorCode.IOTimeout);相反:返回ex.Message.StartsWith("Timeout");我最终得到了Svix、ErwinvanDijk和JosephDaigle的回答。我还检查了ArgumentException://////检查(远程)Microsoft消息队列是否可用//////消息队列的名称。///如果队列可用则返回true,否则返回false。publicstaticboolIsQueueAvailable(stringqueueName){MessageQueue队列;尝试{queue=newMessageQueue(queueName);队列。窥视(新时间跨度(0、0、5));//等待最大值5秒。从队列中接收第一条消息(必要时减少)返回true;}catch(Exceptionex){if(exisArgumentException){//提供的队列名称错误。返回假;}elseif(exisMessageQueueException){//如果消息队列异常发生,要么队列可用但没有条目(检查peek超时),要么队列不存在或您无权访问。返回(((MessageQueueException)ex).MessageQueueErrorCode==MessageQueueErrorCode.IOTimeout);}//发生任何其他错误。返回假;您不能在远程队列上使用Exists方法,因此您必须模拟该远程计算机上的用户:队列分享的所有指定格式名称的内容,如果对你有用,需要了解更多C#学习教程,希望大家多加关注——//usingsusingSystem;使用System.Messaging;使用System.Runtime.InteropServices;使用系统安全;使用System.Security.Principal;//声明advapi32.dll[DllImport("advapi32.dll",SetLastError=true)]publicstaticexternboolLogonUser(stringlpszUsername,stringlpszDomain,stringlpszPassword,intdwLogonType,intdwLogonProvider,outIntPtrphToken);privatevoidIterateRemoteMQ(){IntPtruserToken=IntPtr.Zero;boolsuccess=LogonUser("REMOTE_USERNAME",//远程机器上的用户名".",//域,如果不使用AD,则保留为".""PASSWORD",//远程机器上用户名的密码9,//意味着我们正在使用新的凭据,否则它将尝试模拟本地用户0,outuserToken);if(!success){thrownewSecurityException("登录用户失败");}//遍历每个队列,看看你的队列是否存在,或者对该队列进行一些操作。使用(风owsIdentity.Impersonate(userToken)){MessageQueue[]Queues=MessageQueue.GetPrivateQueuesByMachine("192.168.1.10");foreach(MessageQueuemqinQueues){stringMSMQ_Name=mq.QueueName;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
