【问题标题】:Faulting a WCF channel using netMsmqBinding使用 netMsmqBinding 使 WCF 通道出错
【发布时间】:2012-05-24 16:27:03
【问题描述】:

我有一个基于 netMsmqBinding (MSMQ3) 的 WCF 服务。服务代码不会在 WCF 事务控制下运行,因为服务中的某些操作没有事务能力并且无法回滚。据我了解,这意味着我没有得到任何有毒消息处理等的好处。所以一旦我的服务代码被调用,消息就会永远离开队列。

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

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

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

【问题讨论】:

    标签: wcf netmsmqbinding


    【解决方案1】:

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

    事务控制在某种程度上取决于您。将TransactionScope 包裹在您想要进行事务处理的代码周围。这样可以保证它是事务性的。如果您实现自定义代码,这是队列上的一个属性。或者,您可以通过每个队列单独启用 MSMQ 上的事务。

    毒物队列不是自动的,实际上完全是一个单独的队列。当您检测到无效的消息并写入时,您写入它。

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

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

    我在这里遗漏了什么吗? netMsmqBinding 是否像 http 绑定一样为每个请求创建一个新通道?

    netMsmqBinding 确实为在服务器端读取 的每条消息生成一个新线程,但写入 MSMQ 不会。每个通道生成一个单独的线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2013-02-11
      相关资源
      最近更新 更多