【问题标题】:Calling WCF with netMsmqBinding inside TransactionScope stopping transaction在 TransactionScope 中使用 netMsmqBinding 调用 WCF 停止事务
【发布时间】:2009-10-06 07:31:16
【问题描述】:

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

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

【问题讨论】:

    标签: wcf msmq transactionscope netmsmqbinding


    【解决方案1】:

    我对 MSMQ 不是很了解,但是 Tom Hollander 在MSMQ, IIS and WCF: Getting them to play nicely 上有一个非常好的博客文章系列 - 在第 3 部分中,这是 Tom 谈到获得事务性的链接。

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

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

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

    应该这样做!

    马克

    【讨论】:

    • 谢谢马克。你是对的。我不想要交易行为(尤其是其中一项服务是电子邮件发送服务)。我会试试那个属性。
    【解决方案2】:

    抱歉,问了一个不必要的问题……

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

    [TransactionFlow(TransactionFlowOption.Allowed)]
    

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

    [OperationBehavior(TransactionScopeRequired=true)] 
    

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

    工作是一种享受。

    【讨论】:

    • 还是发布了我的回复,因为它包含一个很好的链接,指向 Tom Hollander 关于 WCF 和 MSMQ 的博客文章系列 - 非常棒!
    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多