Может ли таймер функции Azure вызвать итерации всех больших двоичных объектов в контейнере или каталоге? - PullRequest
0 голосов
/ 05 марта 2020

Можно ли выполнять итерацию и обрабатывать все большие двоичные объекты в контейнере хранения Azure, используя функцию, запускаемую через регулярный интервал (запуск по таймеру).

Путь: {имя-контейнера} / {имя-каталога} / {имя-файла}

using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace SampleNamespace
{
    public static class SampleFunction
    {
        [FunctionName("SampleFunction")]
        public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
        {
            // How to iterate an operate on all blobs?
        }
    }
}

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Вам следует установить этот пакет nuget для хранения больших двоичных объектов Microsoft. Azure .Storage.Blob для функции azure. Тогда вы можете использовать sync method как ListBlobs вместо async method ListBlobsSegmentedAsync. Наконец, вы можете написать код для работы с этими BLOB-объектами.

Код, подобный приведенному ниже:

using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using System;

namespace FunctionApp7
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            log.LogInformation("the blobs list:");

            var connectionString = "DefaultEndpointsProtocol=https;AccountName=xx;AccountKey=xxxx;EndpointSuffix=core.windows.net";
            var containerName = "test4";
            var directoryName = "sub1";

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            CloudBlobContainer container = blobClient.GetContainerReference(containerName);

            //list blobs in a container
            var blobs = container.ListBlobs(useFlatBlobListing: true);

            foreach (IListBlobItem item in blobs)
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;
                    //other operation.
                }
            }

            //list blobs in a directory
            CloudBlobDirectory directory = container.GetDirectoryReference(directoryName);
            var blobs_2 = directory.ListBlobs(useFlatBlobListing: true);

            foreach(IListBlobItem item in blobs_2)
            {
                if (item.GetType() == typeof(CloudBlockBlob))
                {
                    CloudBlockBlob blob = (CloudBlockBlob)item;
                    //other operation.
                }
            }


        }
    }
}
0 голосов
/ 06 марта 2020

Кроме способа с хранилищем BLOB-объектов SDK (Иван предоставил), вы можете использовать привязку BLOB-объектов для получения клиента контейнера, а затем выполнить операцию со списком.

Вы можете обратиться к входу BLOB-объекта Использование , вы можете обнаружить, что он поддерживает привязку типа CloudBlobContainer или CloudBlobDirectory. Вы можете обратиться к приведенному ниже коду.

[FunctionName("Function1")]
public static async System.Threading.Tasks.Task RunAsync([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log,
            [Blob("test",Connection = "AzureWebJobsStorage")]CloudBlobContainer container)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
            var segment = await container.ListBlobsSegmentedAsync(null);
            var blobs = segment.Results;
            foreach (var blob in blobs) {

                log.LogInformation(blob.GetType().ToString(), blob.ToString());
            }
        }

Если будут возвращены все BLOB-объекты и каталог BLOB-объектов, ниже приведен мой результат теста, поэтому вам необходимо оценить, если тип возвращаемого значения CloudBlockBlob или CloudBlobDirectory затем выполните операцию со списком.

enter image description here

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