2012-05-24 36 views
0

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

如果我的服务发生严重故障,我想防止进一步的信息丢失。因此,我记录了刚失败的消息,然后引发普通异常(不是FaultException)。与任何其他WCF服务绑定一样,我期望这会错误地通道(本例中为MSMQ通道调度程序),并且不会接收来自队列的更多消息。

但我似乎无法得到这种行为(无双关)的工作。无论我的服务代码是否引发异常,我都会继续获取路由到服务的消息。

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

回答

1

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

交易控制在某种程度上取决于您。围绕你想要交易的代码包装一个TransactionScope。这样保证是事务性的。如果您实现自定义代码,则这是队列中的一个属性。或者,您可以分别在每个队列上启用MSMQ上的事务。

毒素队列不是自动的,但实际上是一个单独的队列。当您检测到一条无效的消息并且您向其写入消息时,就会向其写入消息。

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

从MSMQ接收时引发异常无效。它没有什么可以抛出异常。这是有毒队列进场的地方。您写入毒性队列以指示发生错误。

我在这里错过了什么吗? netMsmqBinding的行为与http绑定的行为是一样的,即为每个请求创建一个新的通道?

的netMsmqBinding确实产生每个消息是一个新的线程读取在服务器端,但写入MSMQ没有。每个通道生成一个单独的线程。