2017-01-13 11 views
3

아래 오류 받기Hangfire : Azure SQL : 새 작업 추가 실패

내부 예외 : "개체 참조가 개체의 인스턴스로 설정되지 않았습니다." 스택 추적 :at System.Transactions.Transaction.GetPromotedToken()

오류는 회선 연결에서 비롯된 것입니다 .EnlistTransaction (Transaction.Current); 연결 문자열에 enlist = false를 설정하더라도 코드 아래에.

`internal T UseTransaction<T>([InstantHandle] Func<DbConnection, DbTransaction, T> func, IsolationLevel? isolationLevel) 
    { 
    #if NETFULL 
     using (var transaction = CreateTransaction(isolationLevel ?? _options.TransactionIsolationLevel)) 
     { 
      var result = UseConnection(connection => 
      { 
       connection.EnlistTransaction(Transaction.Current); 
       return func(connection, null); 
      }); 

      transaction.Complete(); 

      return result; 
     } 
}` 

enlist = true로 설정하면 connection.Open();에서 오류가 발생합니다. 아래의 코드에서

internal DbConnection CreateAndOpenConnection() 
    { 
     if (_existingConnection != null) 
     { 
      return _existingConnection; 
     } 

     var connection = new SqlConnection(_connectionString); 
     connection.Open(); 

     return connection; 
    } 

두 방법은 Hangfire.SqlServer.SqlServerStorage 클래스에서 존재

로컬 DB (SQL 서버 2014)에 연결하면 같은 코드가 작동합니다.

토론에 배치되어 WCF Transaction against Azure SQL DB이 문제와 관련이 있는지 확실하지 않습니다.

편집 :

HangFire 구성

GlobalConfiguration.Configuration.UseSqlServerStorage(
       Database.ConnectionString, 
       new SqlServerStorageOptions 
       { 
        QueuePollInterval = TimeSpan.FromSeconds(10), 
        PrepareSchemaIfNecessary = true 
       }); 

작업 인큐

BackgroundJob.Enqueue(() => Update(connectionToken, intFileUniqueId)); 

도와주세요. 미리 감사드립니다.

+0

Hanfire 작업을 추가하는 코드를 추가 할 수 있습니까? –

+0

안녕하세요, HangFire 구성 및 작업 대기열에 코드 스 니펫을 추가했습니다. –

+0

BackgroundJob.Enqueue (x => x.Update (connectionToken, intFileUniqueId)); x 란 무엇입니까? 줄을 대기열에 넣는 것보다 줄 바꿈하는 코드를 추가 할 수 있습니까? –

답변

1

발견. 메소드 대기열에 대한 호출이 트랜잭션 내부에 있었고 어떤 방식으로 배포 트랜잭션으로 이어졌으며 Azure SQL은 트랜잭션을 지원하지 않습니다.

public override void UpdateFile(int intUniqueId) 
    { 
     using (var scope = GetTransactionScope(...)) 
     { 
      QueueJob<Updater>(x => x.Update(token, intUniqueId)); 
      scope.Complete(); 
     } 
    } 


    private static void QueueJob<T>(Expression<Action<T>> action) 
    { 
      BackgroundJob.Enqueue(action); 
    } 

호출자 방법 작품의 트랜잭션 범위를 제거 :

아래의 코드를 생각해 보자. 트랜잭션 범위의 필요성을 확인하고 있는데, 필요하지 않으면 제거 할 것입니다. !!!