我有一个运行在MSMQ上的WCF日志记录服务。项目记录到Sql Server 2005数据库。如果在TransactionScope外部使用,则每个功能都正确。在TransactionScope实例中使用时,调用始终会导致事务中止。消息=“事务已中止”。
如果要让此调用在Transaction中工作,我需要做什么?它甚至可能吗?我已经读过,为了使客户端事务流过服务边界,绑定必须支持事务流,这会立即将绑定限制为NetNamedPipeBinding,NetTcpBinding,WSHttpBinding,WSDualHttpBinding和WSFederationHttpBinding。
答案 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)]
关于合同的实施(服务本身)。
努力享受。