MSMQ 在 .net Framework 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-84ca521efb5b0000298",这对于跨森林活动是不可翻译的。

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

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

我希望有一些我错过了,有一个明显的解决方案来做到这一点,因为完全缺乏对这个特定场景的答案。

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

在客户端计算机上,您需要卸载Message QueuingMessage Queuing Services下的Directory Services Integration特性。

然后请求能够被正确路由回发送方。我不确定这个功能是。net 4.5自动添加的,还是被它修改了,但是禁用它立即解决了这个问题(正在运行的web应用程序甚至没有重新启动——下一个请求刚刚工作)

最新更新