WCF msmq transactioned和工作单元

Pat*_*ick 24 c# nhibernate wcf msmq transactions

我构建了一个事务性的MSMQ WCF服务.我在我的操作中使用了以下属性:

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
Run Code Online (Sandbox Code Playgroud)

我在服务中使用Nhibernate.使用Nhibernate我在会话中提交.如果我禁用Nhibernate提交,则会正确处理消息并从队列中删除.通过此提交,Nhibernate事务正确,但我的消息进入重试队列.

这是我进入Nhibernate服务跟踪的例外.

Description Handling an exception. Exception details: System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Transaction'.
   at System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)
   at System.Transactions.TransactionScope.SetCurrent(Transaction newCurrent)
   at System.Transactions.TransactionScope.PushScope()
   at System.Transactions.TransactionScope.Initialize(Transaction transactionToUse, TimeSpan scopeTimeout, Boolean interopModeSpecified)
   at System.Transactions.TransactionScope..ctor(Transaction transactionToUse, TransactionScopeAsyncFlowOption asyncFlowOption)
   at System.Transactions.TransactionScope..ctor(Transaction transactionToUse)
   at NHibernate.Transaction.AdoNetWithDistributedTransactionFactory.DistributedTransactionContext.System.Transactions.IEnlistmentNotification.Prepare(PreparingEnlistment preparingEnlistment)
   --- End of inner exception stack trace ---
   at System.Transactions.TransactionStatePromotedAborted.PromotedTransactionOutcome(InternalTransaction tx)
   at System.Transactions.TransactionStatePromotedEnded.EndCommit(InternalTransaction tx)
   at System.Transactions.CommittableTransaction.Commit()
   at System.ServiceModel.Dispatcher.TransactionInstanceContextFacet.Complete(Transaction transaction, Exception error)
Run Code Online (Sandbox Code Playgroud)

似乎nhibernate提交破坏了WCF上的事务.我找不到解决这个问题的方法.

任何帮助可能会受到赞赏

小智 1

我对这些系统不太熟悉,但最简单的答案通常是正确的,所以我会尝试一下 - 猜测一下,我会说无论您调用项目的服务是什么,都会停止该过程在有机会删除项目之前将其删除,因此我会在您调用项目的服务中添加某种函数调用,以便在完成事务之前强制从列表中删除项目。

当然,我不熟悉这个主题,所以不要相信我的话 - 这只是我在我的编程知识范围内针对类似问题通常会做的事情。