Сделка на стороне клиента - PullRequest
0 голосов
/ 31 июля 2011

У меня большая проблема с использованием или пониманием использования транзакции с wsdualhttpbinding WCF.

У меня есть что-то вроде этого:

IService:

[ServiceContract]
public interface IService
{
  //...
  [OperationContract]
  [ApplyDataContractResolver]
  [TransactionFlow(TransactionFlowOption.Mandatory)] 
  bool SaveDevice(Device device);
  //...
}

Service.svc.cs:

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
  public class Service : IService
  {
   [OperationBehavior(TransactionScopeRequired = true)]
   public bool SaveDevice(Device device)
   {
            bool temp = false;
            Transaction transaction = Transaction.Current;

            using (EntityConn context = new EntityConn())
            {
                try
                {
                  //....
                }
             }
    }
   }

Model.cs Итак, я в моем клиенте пытаюсь выполнить операцию с требованиями транзакции:

if (Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty)
        {
            using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
            {
                try
                {
                   //do some stuff
                }
            }
          }

Ну, я получаю сообщение об ошибке: Transaction.Current пуст

  1. Я на правильном пути?
  2. Когда нет, как я могу это решить?

Спасибо за помощь

РЕДАКТИРОВАТЬ : Мне просто нужно было поместить if после использования

    using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
    {
     if (Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty)
     {
            try
            {
               //do some stuff
            }
     }
    }

Ответы [ 2 ]

1 голос
/ 31 июля 2011

Вне TransactionScope, я думаю, Transaction.Current всегда будет нулевым.Сначала необходимо ввести область транзакции, а затем начать доступ к свойствам Transaction.Current.Похоже, вы пытаетесь выполнить не-транзакционную операцию на клиенте?Если это так, попробуйте следующее:

using (TransactionScope tran = new TransactionScope())
{
    if (Transaction.Current.TransactionInformation.DistributedIdentifier == Guid.Empty)
    {
        // ambient transaction is not escalated; exclude this operation from the ambient transaction
        using (TransactionScope tran2 = new TransactionScope(TransactionScopeOption.Suppress))
        {
            // do some stuff
        }
    }
    else
    {
        // ambient transaction is escalated
        // do some other stuff
    }
}

Примечание. Я скопировал условие, как оно есть в вашем примере кода, но вы должны убедиться, что это правильный тест. Согласно MSDN , TransactionInformation.DistributedIdentifier означает null, а не Guid.Empty вне распределенной транзакции.

0 голосов
/ 31 июля 2011

Я думаю, что вы хотите добавить AutoEnlistTransaction = true в свой атрибут OperationBehavior. Также вы можете добавить AutoCompleteTransaction = true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...