安装VS2012后,尝试使用多年未被有意义修改的古老应用程序,MSMQ消息正在丢失。
研究证明它们正在目标服务器上处理,但由于响应队列不正确而无法正确返回。它使用的是PRIVATE:格式,而不是传递给构造函数的DIRECT:OS:格式。
具体来说,这是执行:
Dim lobj_Queue As New MessageQueue("FormatName:DIRECT=OS:" & astrServer & "\" & astrQueue)
其中astrServer
是本地计算机的名称,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
属性的源代码表明,当前抛出了抛出的异常,它回退到解析队列路径的先前方法。这将首次为目标服务器生成有效的队列路径,因此消息将到达服务器并进行处理,但是在本地计算机上生成响应队列时,调用会成功并生成目标无法理解的格式名称服务器,因此永远不会收到服务器的响应,并且永远保留在传出队列中。
有没有办法让这项工作继续下去?据我所知,没有办法使用私有响应队列,因为您在本地生成的任何名称只能在同一个林中理解。
我希望有一些我缺少的东西,有一个明显的解决方案可以做到这一点,因为这个特定场景完全没有答案。
答案 0 :(得分:3)
在处理效率低下的解决方法一段时间之后,我们的一位同事找到了解决问题的方法:
在客户端计算机上,您需要卸载Directory Services Integration
和Message Queuing
下的Message Queuing Services
功能。
然后,请求可以正确地路由回发件人。 我不确定这个功能是由.NET 4.5自动添加还是仅由它修改,但是禁用它会立即修复问题(正在运行的Web应用程序甚至没有重启 - 下一个请求刚刚起作用)