1

我有一个 WCF 服务,它设置为使用 MSMQ 传输到另一台机器上的服务。我们正在尝试将客户端移动到另一台机器上,但它不起作用。启用 MSMQ.End2End 事件日志给我们

Message with ID {6940f8fa-3d31-4db0-ae2b-59bc98c99f2c}\25321 was sent to queue DIRECT=OS:iisapp1-vvpm\private$\TransactionalEmailService/TransactionalEmail.Service.TransactionalEmailService.svc

这让我认为它在我们的机器上正常工作,但我们在目标机器上找不到它的任何痕迹。服务没有被调用,我们在死信队列(或我们能想到的任何其他地方)中找不到消息。

此外,直接从我的机器上的 Visual Studio 运行代码会使其工作。

将接收队列更改为 DEV 机器也会导致代码工作,这让我进一步认为这是接收机器的问题。(我只是不知道是什么)

更新 1: 我回到它并注意到我试图在事务死信队列中发送的所有消息。错误消息是“到达队列的时间已过”。查看连接状态,它处于非活动状态,发送另一条消息不会导致它变为连接状态。我重新启动机器,它再次“连接”。我尝试再次发送消息,并查看队列状态。有 12 条消息,所有消息都未确认(0 条未处理)。

4

4 回答 4

1

因此,一旦端点机器重新启动,它就会再次发生。我遇到了这篇文章,这是真正的解决方案:

http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

(如果链接消失:)

看起来 MSMQ 中有一个 ID 作为消息的一部分发送。远程主机使用该 ID 作为缓存中的键来确定将 ack 发送回给谁。如果您克隆一台机器,它会在注册表中为该 ID 获取相同的值,这使得另一台机器不知道将其发回给谁。所以它会把它发送到错误的机器上,而错误的机器会丢弃它,而另一台机器会被一堆它一直试图发送的消息卡住。这也解释了为什么它一天才开始工作......缓存过期并且“正确”的机器被放入作为端点。

在克隆的机器上重新安装 MSMQ 可以解决此问题。

于 2013-01-15T21:09:11.117 回答
0

我真的不确定这里可能是这种情况(我在 MSMQ 的上下文中没有使用 WCF 的任何经验),但是您所说的这种行为的一个更常见的原因是缺少强制性使用 MessageQueue 构造函数(如 'FormatName:DIRECT=...')时,队列名称中的 FormatName 上的驼峰式大小写,或以某种方式错误地获取名称。消息中的队列名称与 svc 结尾看起来有点奇怪,但这可能只是 WCF 的事情吗?希望这至少有助于让您朝着正确的方向前进。

于 2012-11-16T20:04:34.923 回答
0

不知道在这里说什么,但它现在有效。阅读一些内容帮助我了解了队列的状态(单击功能/消息队列下的传出队列)。从那里我发现了这篇带有修补程序的知识库文章:http: //support.microsoft.com/kb/976438它似乎并不适用,但人们遇到的症状都是一样的。我们的人试图安装它,但它失败了,他们没有重新启动......但由于某种原因,消息队列开始工作。

如果有人提出了一些见解,我会很乐意支持他们或给他们赏金(如果足够快的话)。但我现在只接受这个作为答案。

于 2012-11-30T21:53:59.157 回答
-1

这通常是由远程队列的权限引起的,通常的情况是,如果您使用的是私有队列并且由您的 wcf 服务远程访问。

尝试使用公共队列。

于 2012-11-29T05:47:22.150 回答