2015-09-22 5 views
0

Я создаю код, чтобы сохранить журнал в лазурных таблицах. И я переопределяю метод ActivateOptions для создания таблицы, если она существует.Azure Table и log4net

public override async void ActivateOptions() 
     { 
      base.ActivateOptions(); 

      CloudStorageAccount storageAccount = CloudStorageAccount.Parse 
       (CloudConfigurationManager.GetSetting("StorageConnectionString")); 
      _tableClient = storageAccount.CreateCloudTableClient(); 

      await CraeteTablesIfNotExist(); 
     } 

     private async Task CraeteTablesIfNotExist() 
     { 
      CloudTable logCloudTable = _tableClient.GetTableReference(TableName); 
      await logCloudTable.CreateIfNotExistsAsync(); 
     } 

И код, чтобы сохранить сообщение для хранения больших двоичных объектов:

protected override async void Append(LoggingEvent loggingEvent) 
     { 
      try 
      { 
       CloudTable cloudTable = _tableClient.GetTableReference(TableName); 
       TableBatchOperation tableBatchOperation = new TableBatchOperation(); 

       tableBatchOperation.InsertOrReplace(new LogEntry($"{DateTime.UtcNow:yyyy-MM}", 
        $"{DateTime.UtcNow:dd HH:mm:ss.fff}-{Guid.NewGuid()}") 
       { 
        LoggerName = loggingEvent.LoggerName, 
        Message = loggingEvent.RenderedMessage 
       }); 

       await cloudTable.ExecuteBatchAsync(tableBatchOperation); 
      } 
      catch (DataServiceRequestException drex) 
      { 
       ErrorHandler.Error("Couldwrite log entry", drex); 
      } 
      catch (Exception ex) 
      { 
       ErrorHandler.Error("Exception log entry", ex); 
      } 
     } 

Это не работает! Я не знаю, почему, но если я переведу код из ActivateOptions в таблицы конструкторов, создайте успех. код ниже работает мой метод ActivateOptions и регистрирует сообщение:

[TestFixture] 
public class Log4NetHandler : TableStorage 
{ 
    private TableStorage _storage; 

    [SetUp] 
    public void Init() 
    { 
     _storage = new TableStorage(); 
     _storage.ActivateOptions(); 
     BasicConfigurator.Configure(_storage); 
    } 

    [Test] 
    public void CheckLogger() 
    { 
     Append(new LoggingEvent(new LoggingEventData 
     { 
      LoggerName = "Taras", 
      Message = "Message" 
     })); 
    } 
} 

Я не понимаю, почему, если я бегу таблица ActivateOptions методы в лазури не создается?

ответ

1

Можете ли вы попробовать реализовать метод ActivateOptions без асинхронных вызовов? У меня есть старый код, который почти идентичен вашему, который работает нормально.

public override void ActivateOptions() 
{ 
    base.ActivateOptions(); 

    _account = CloudStorageAccount.Parse(ConnectionString); 
    _client = _account.CreateCloudTableClient(); 
    _table = _client.GetTableReference(TableName); 
    _table.CreateIfNotExists(); 
} 
+0

Хорошо, но я хотел бы использовать асинхронные звонки. И я думаю, что это возможно, но я не знаю, как :) –