MSMQ与.net framework 4.5不兼容跨服务器

时间:2013-04-02 21:34:36

标签: .net msmq .net-4.5

安装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属性的源代码表明,当前抛出了抛出的异常,它回退到解析队列路径的先前方法。这将首次为目标服务器生成有效的队列路径,因此消息将到达服务器并进行处理,但是在本地计算机上生成响应队列时,调用会成功并生成目标无法理解的格式名称服务器,因此永远不会收到服务器的响应,并且永远保留在传出队列中。

有没有办法让这项工作继续下去?据我所知,没有办法使用私有响应队列,因为您在本地生成的任何名称只能在同一个林中理解。

我希望有一些我缺少的东西,有一个明显的解决方案可以做到这一点,因为这个特定场景完全没有答案。

1 个答案:

答案 0 :(得分:3)

在处理效率低下的解决方法一段时间之后,我们的一位同事找到了解决问题的方法:

在客户端计算机上,您需要卸载Directory Services IntegrationMessage Queuing下的Message Queuing Services功能。

然后,请求可以正确地路由回发件人。 我不确定这个功能是由.NET 4.5自动添加还是仅由它修改,但是禁用它会立即修复问题(正在运行的Web应用程序甚至没有重启 - 下一个请求刚刚起作用)