Хранилище BLOB-объектов Azure не загружается - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь загрузить текстовый файл из потока в AzureBlobStorage в .Net Core, но кажется, что он молча терпит неудачу. Я читаю данные из базы данных и записываю их в MemoryStream, используя StreamWriter. На момент загрузки в BlobStorage Stream имеет длину 7147, поэтому я знаю, что в нем есть данные.

Вот мой код для загрузки файла:

public static async void UploadFromStream(string fileName, Stream stream, string fileExtenstion = "txt")
{
    var storageAccount = CloudStorageAccount.Parse(_connectionString);
    var blobClient = storageAccount.CreateCloudBlobClient();
    var container = blobClient.GetContainerReference("logs");
    // By this point, I have a reference to my `logs` container which exists
    var blockBlob = container.GetBlockBlobReference($"{fileName}.{fileExtenstion}");

    try
    {
        stream.Position = 0;
        await blockBlob.UploadFromStreamAsync(stream);
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

Вызывается:

var memoryStream = new MemoryStream();
using (var writer = new StreamWriter(memoryStream))
{
    while (reader.Read())
    {
        writer.WriteLine(
            $"[{reader["Timestamp"]}][{reader["Level"].ToString().ToUpper()}] :: {reader["Message"]}{(!string.IsNullOrWhiteSpace(reader["Exception"].ToString()) ? " -- " + reader["Exception"] : "")}");
    }
    Task.Run(() => StorageService.UploadFromStream($"logfile_{DateTime.Today:s}", memoryStream)).Wait();
}

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

Я даже пытался использовать byte[] bytes = stream.ToArray() и blockBlob.UploadFromByteArrayAsync, но все еще безрезультатно.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Почему Task.Run(() => StorageService.UploadFromStream($"logfile_{DateTime.Today:s}", memoryStream)).Wait(); и почему нельзя просто await на нем, как показано ниже, при условии, что вы измените сигнатуру метода на public static async Task UploadFromStream(..., как уже предлагалось в другом ответе

await StorageService.UploadFromStream($"logfile_{DateTime.Today:s}", memoryStream)
0 голосов
/ 02 ноября 2018

Не использовать async void (кроме обработчиков событий). См. Async / Await - Лучшие практики асинхронного программирования

Вместо этого используйте public static async Task UploadFromStream.

Возможно, вы получите исключение и сможете отследить ошибку.

...