4

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

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

我希望我缺少一些东西,鉴于完全缺乏针对这种特定情况的答案,有一个明显的解决方案可以做到这一点。

4

1 回答 1

3

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

在客户端计算机上,您需要卸载该Directory Services Integration功能,该功能位于Message Queuing和下Message Queuing Services

然后请求能够被正确地路由回发送者。我不确定此功能是由 .NET 4.5 自动添加还是由它简单修改,但禁用它会立即解决问题(正在运行的 Web 应用程序甚至没有重新启动 - 下一个请求刚刚起作用)

于 2013-04-09T20:02:39.377 回答