在TransactionScope内部使用netMsmqBinding调用WCF停止事务

时间:2009-10-06 07:31:17

标签: wcf msmq transactionscope netmsmqbinding

我有一个运行在MSMQ上的WCF日志记录服务。项目记录到Sql Server 2005数据库。如果在TransactionScope外部使用,则每个功能都正确。在TransactionScope实例中使用时,调用始终会导致事务中止。消息=“事务已中止”。

如果要让此调用在Transaction中工作,我需要做什么?它甚至可能吗?我已经读过,为了使客户端事务流过服务边界,绑定必须支持事务流,这会立即将绑定限制为NetNamedPipeBinding,NetTcpBinding,WSHttpBinding,WSDualHttpBinding和WSFederationHttpBinding。

2 个答案:

答案 0 :(得分:4)

我对MSMQ知之甚少,但汤姆·霍兰德(Tom Hollander)在MSMQ, IIS and WCF: Getting them to play nicely上发表了一篇非常好的博客文章系列 - 第3部分是汤姆谈到获得交易的链接。

MSMQ可以是交易性的 - 或者不是。在WCF中,您可以使用与事务相关的属性来装饰服务契约以及单个操作契约(方法),例如是否允许,禁止或需要事务上下文。

据我了解,在您的设置中,您不希望MSMQ部分是事务性的 - 但即使存在环境事务,您也应该能够使用它。在这种情况下,您需要将TransactionFlow =“ALlowed”添加到您的操作合同中,如下所示:

[ServiceContract]
public interface ILoggingService
{
  [OperationContract]
  [TransactionFlow(TransactionFlowOption.Allowed)]
  void LogData(......);
}

应该这样做!

马克

答案 1 :(得分:2)

对不必要的问题抱歉...

我已经解决了我的问题。我需要放置

[TransactionFlow(TransactionFlowOption.Allowed)]

关于服务合同中的操作然后

[OperationBehavior(TransactionScopeRequired=true)] 

关于合同的实施(服务本身)。

努力享受。