使用netMsmqBinding对WCF通道进行故障排除

时间:2012-05-24 16:27:03

标签: wcf netmsmqbinding

我有一个基于netMsmqBinding(MSMQ3)的WCF服务。服务代码不在WCF事务控制下运行,因为服务中的某些操作没有事务功能且无法回滚。据我了解,这意味着我没有获得有害信息处理等方面的任何好处。因此,一旦我的服务代码被调用,该消息将永远不在队列中。

如果我的服务出现严重故障,我希望防止进一步的邮件丢失。所以我记录刚刚失败的消息,然后引发一个普通的异常(而不是FaultException)。与任何其他WCF服务绑定一样,我希望这会使通道出错(在这种情况下为MSMQ通道调度程序),并且不会从队列中接收更多消息。

但我似乎无法让这种行为(没有双关语)起作用。无论我的服务代码是否抛出异常,我都会继续将消息路由到服务。

我在这里遗漏了什么吗? netMsmqBinding的行为类似于http绑定,因为为每个请求创建了一个新通道吗?如果是这样,那么任何关于如何解决我的问题的想法将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

服务代码不在WCF事务控制下运行,因为服务中的某些操作没有事务功能且无法回滚。据我了解,这意味着我没有获得毒物消息处理等任何好处。

交易控制在某些方面取决于您。围绕您想要成为交易的代码包裹TransactionScope。这样就保证了它是事务性的。如果实现自定义代码,则这是队列中的属性。或者,您可以单独为每个队列启用MSMQ上的事务。

毒性队列不是自动的,但实际上是一个单独的队列。当您检测到无效的消息并写入消息时,您可以写入该消息。

  

因此,我记录刚刚失败的消息,然后引发一个普通的异常(而不是FaultException)。

从MSMQ接收时引发异常不起作用。没有什么可以抛出异常。这是毒药队列发挥作用的地方。您写入毒性队列以指示发生了错误。

  

我在这里遗漏了什么吗? netMsmqBinding的行为类似于http绑定,因为为每个请求创建了一个新通道吗?

netMsmqBinding确实为服务器端 read 的每条消息生成一个新线程,但是写入MSMQ却没有。每个通道都会生成一个单独的线程。