Подтвердить что ты не робот

WCF msmq транзакция и единица работы

Я построил службу WCF MSMQ, которая является транзакционной. В моей работе я использовал следующий атрибут:

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]

Я использую службу 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)

Кажется, что nhibernate совершает уничтожение транзакции на WCF. Я не могу найти способ исправить это.

Любая помощь может быть оценена

4b9b3361

Ответ 1

Я не слишком хорошо знаком с этими системами, но самый простой ответ, как правило, правильный, поэтому я дам ему шанс - предположим, я бы сказал, что любой сервис, на который вы звоните, останавливая процесс, который удаляет элементы, прежде чем он сможет их удалить, поэтому я бы добавил какой-то вызов функции в службу, вызывающую элементы, чтобы она была вынуждена удалить элемент из списка, прежде чем он сможет закончить транзакции.

Конечно, я не знаком с этой темой, поэтому не задумывайтесь об этом - это просто то, что я сделал бы для подобной проблемы в рамках моих знаний о программировании.