安装 VS2012 并尝试使用多年未进行有意义修改的古老应用程序后,MSMQ 消息正在丢失。
研究证明它们正在目标服务器上进行处理,但由于响应队列不正确而无法正确返回。它使用的是 PRIVATE: 格式,而不是传递给构造函数的 DIRECT:OS: 格式。
具体来说,这是执行的:
Dim lobj_Queue As New MessageQueue("FormatName:DIRECT=OS:" & astrServer & "\" & astrQueue)
whereastrServer
是我的本地机器astrQueue
的名称,也是我希望将响应放入的响应队列的名称。
生成的队列格式名称"PRIVATE=d69f93e2-18f1-42eb-a468-84ca521efb5b\00000298"
不能用于跨林活动。
运行为 .net framework 3.5 构建的相同应用程序正常工作。
.net 4.5 似乎试图自动解析队列格式。在某一时刻,根据http://connect.microsoft.com/VisualStudio/feedback/details/762194/accessing-messagequeue-formatname-throws-an-exception-on-queues-returned-by-getprivatequeuesbymachine-remotemachine-on- a-workgroup-computer#details此行为导致异常。
调试到MessageQueue.FormatName
属性的来源显示,当前,抛出的异常已经被处理,并且它回退到之前的解析队列路径的方法。这会为目标服务器第一次生成有效的队列路径,因此消息到达服务器并被处理,但是在本地机器上生成响应队列时,调用成功并生成目标无法理解的格式名称服务器,因此永远不会收到服务器的响应,并且永远保留在传出队列中。
有没有办法继续使这项工作?据我所知,没有办法使用私有响应队列,因为您在本地生成的任何名称都只能在同一个林中理解。
我希望我缺少一些东西,鉴于完全缺乏针对这种特定情况的答案,有一个明显的解决方案可以做到这一点。