1

我有一个通过 MSMQ 运行的 WCF 日志记录服务。项目记录到 Sql Server 2005 数据库。如果在 TransactionScope 之外使用,每个功能都可以正常工作。在 TransactionScope 实例中使用时,调用总是会导致事务中止。Message = "事务已中止"。

我需要做什么才能让这个调用在事务中工作?有没有可能。我已经读过,对于流经服务边界的客户端事务,绑定必须支持事务流,这会立即将绑定限制为仅 NetNamedPipeBinding、NetTcpBinding、WSHttpBinding、WSDualHttpBinding 和 WSFederationHttpBinding。

4

2 回答 2

4

我对 MSMQ 不是很了解,但是 Tom Hollander 有一个关于MSMQ、IIS 和 WCF 的非常好的博客文章系列:让它们玩得很好——在第 3 部分中,这是 Tom 谈到获得事务的链接。

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

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

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

应该这样做!

马克

于 2009-10-06T08:21:41.017 回答
2

抱歉问了个不必要的问题...

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

[TransactionFlow(TransactionFlowOption.Allowed)]

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

[OperationBehavior(TransactionScopeRequired=true)] 

关于合同的执行(服务本身)。

工作一种享受。

于 2009-10-06T08:15:46.807 回答