Udostępnij za pośrednictwem


Biblioteka klienta obiektów blob usługi Azure WebJobs Storage dla platformy .NET — wersja 5.1.1

To rozszerzenie zapewnia funkcje uzyskiwania dostępu do obiektów blob usługi Azure Storage w Azure Functions.

Wprowadzenie

Instalowanie pakietu

Zainstaluj rozszerzenie Storage Blobs za pomocą narzędzia NuGet:

dotnet add package Microsoft.Azure.WebJobs.Extensions.Storage.Blobs

Wymagania wstępne

Do korzystania z tego pakietu potrzebna jest subskrypcja platformy Azure i konto magazynu .

Aby utworzyć nowe konto magazynu, możesz użyć witryny Azure Portal, Azure PowerShell lub interfejsu wiersza polecenia platformy Azure. Oto przykład użycia interfejsu wiersza polecenia platformy Azure:

az storage account create --name <your-resource-name> --resource-group <your-resource-group-name> --location westus --sku Standard_LRS

Uwierzytelnianie klienta

Aby rozszerzenie uzyskiwało dostęp do obiektów blob, potrzebne będą parametry połączenia, które można znaleźć w witrynie Azure Portal lub przy użyciu poniższego fragmentu wiersza polecenia platformy Azure .

az storage account show-connection-string -g <your-resource-group-name> -n <your-resource-name>

Parametry połączenia można dostarczyć za pomocą ustawienia aplikacji AzureWebJobsStorage.

Kluczowe pojęcia

Korzystanie z wyzwalacza obiektu blob

Wyzwalacz usługi Blob Storage uruchamia funkcję po wykryciu nowego lub zaktualizowanego obiektu blob. Zawartość obiektu blob jest dostarczana jako dane wejściowe funkcji.

Postępuj zgodnie z samouczkiem , aby dowiedzieć się więcej o wyzwalaniu funkcji platformy Azure po zmodyfikowaniu obiektu blob.

Strategie nasłuchiwania

Wyzwalacz obiektu blob oferuje kilka strategii, jeśli chodzi o nasłuchiwanie tworzenia i modyfikowania obiektów blob. Strategię można dostosować, określając Source właściwość elementu BlobTrigger (zobacz przykłady poniżej).

Strategia domyślna

Domyślnie wyzwalacz obiektów blob używa sondowania , które działa jako rozwiązanie hybrydowe między inspekcją rejestrowania analizy usługi Azure Storage a okresowym skanowaniem kontenerów. Obiekty blob są skanowane w grupach 10 000 jednocześnie z tokenem kontynuacji używanym między interwałami.

Rejestrowanie analizy usługi Azure Storage nie jest domyślnie włączone. Zobacz Rejestrowanie analizy usługi Azure Storage , aby dowiedzieć się, jak ją włączyć.

Ta strategia nie jest zalecana w przypadku aplikacji lub scenariuszy o dużej skali, które wymagają małych opóźnień.

Event Grid

Zdarzenia usługi Blob Storage mogą służyć do nasłuchiwania zmian. Ta strategia wymaga dodatkowej konfiguracji.

Ta strategia jest zalecana w przypadku aplikacji o dużej skali.

Korzystanie z powiązania obiektu blob

Powiązanie wejściowe umożliwia odczytywanie danych magazynu obiektów blob jako danych wejściowych funkcji platformy Azure. Powiązanie wyjściowe umożliwia modyfikowanie i usuwanie danych magazynu obiektów blob w funkcji platformy Azure.

Postępuj zgodnie z samouczkiem dotyczącym powiązania wejściowego i powiązaniem danych wyjściowych , aby dowiedzieć się więcej o używaniu tego rozszerzenia do uzyskiwania dostępu do obiektów blob.

Przykłady

Reagowanie na zmianę obiektu blob

Strategia domyślna

public static class BlobFunction_ReactToBlobChange
{
    [FunctionName("BlobFunction")]
    public static void Run(
        [BlobTrigger("sample-container/sample-blob")] Stream blobStream,
        ILogger logger)
    {
        using var blobStreamReader = new StreamReader(blobStream);
        logger.LogInformation("Blob sample-container/sample-blob has been updated with content: {content}", blobStreamReader.ReadToEnd());
    }
}

Strategia usługi Event Grid

public static class BlobFunction_ReactToBlobChange_EventGrid
{
    [FunctionName("BlobFunction")]
    public static void Run(
        [BlobTrigger("sample-container/sample-blob", Source = BlobTriggerSource.EventGrid)] Stream blobStream,
        ILogger logger)
    {
        using var blobStreamReader = new StreamReader(blobStream);
        logger.LogInformation("Blob sample-container/sample-blob has been updated with content: {content}", blobStreamReader.ReadToEnd());
    }
}

Odczytywanie ze strumienia

public static class BlobFunction_ReadStream
{
    [FunctionName("BlobFunction")]
    public static void Run(
        [BlobTrigger("sample-container/sample-blob-1")] Stream blobStream1,
        [Blob("sample-container/sample-blob-2", FileAccess.Read)] Stream blobStream2,
        ILogger logger)
    {
        using var blobStreamReader1 = new StreamReader(blobStream1);
        logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", blobStreamReader1.ReadToEnd());
        using var blobStreamReader2 = new StreamReader(blobStream2);
        logger.LogInformation("Blob sample-container/sample-blob-2 has content: {content}", blobStreamReader2.ReadToEnd());
    }
}

Zapisywanie w strumieniu

public static class BlobFunction_WriteStream
{
    [FunctionName("BlobFunction")]
    public static async Task Run(
        [BlobTrigger("sample-container/sample-blob-1")] Stream blobStream1,
        [Blob("sample-container/sample-blob-2", FileAccess.Write)] Stream blobStream2,
        ILogger logger)
    {
        await blobStream1.CopyToAsync(blobStream2);
        logger.LogInformation("Blob sample-container/sample-blob-1 has been copied to sample-container/sample-blob-2");
    }
}

Wiązanie z ciągiem

public static class BlobFunction_String
{
    [FunctionName("BlobFunction")]
    public static void Run(
        [BlobTrigger("sample-container/sample-blob-1")] string blobContent1,
        [Blob("sample-container/sample-blob-2")] string blobContent2,
        ILogger logger)
    {
        logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", blobContent1);
        logger.LogInformation("Blob sample-container/sample-blob-2 has content: {content}", blobContent2);
    }
}

Zapisywanie ciągu w obiekcie blob

public static class BlobFunction_String_Write
{
    [FunctionName("BlobFunction")]
    public static void Run(
        [BlobTrigger("sample-container/sample-blob-1")] string blobContent1,
        [Blob("sample-container/sample-blob-2")] out string blobContent2,
        ILogger logger)
    {
        logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", blobContent1);
        blobContent2 = blobContent1;
        logger.LogInformation("Blob sample-container/sample-blob-1 has been copied to sample-container/sample-blob-2");
    }
}

Wiązanie z tablicą bajtów

public static class BlobFunction_ByteArray
{
    [FunctionName("BlobFunction")]
    public static void Run(
        [BlobTrigger("sample-container/sample-blob-1")] byte[] blobContent1,
        [Blob("sample-container/sample-blob-2")] byte[] blobContent2,
        ILogger logger)
    {
        logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", Encoding.UTF8.GetString(blobContent1));
        logger.LogInformation("Blob sample-container/sample-blob-2 has content: {content}", Encoding.UTF8.GetString(blobContent2));
    }
}

Zapisywanie tablicy bajtów w obiekcie blob

public static class BlobFunction_ByteArray_Write
{
    [FunctionName("BlobFunction")]
    public static void Run(
        [BlobTrigger("sample-container/sample-blob-1")] byte[] blobContent1,
        [Blob("sample-container/sample-blob-2")] out byte[] blobContent2,
        ILogger logger)
    {
        logger.LogInformation("Blob sample-container/sample-blob-1 has been updated with content: {content}", Encoding.UTF8.GetString(blobContent1));
        blobContent2 = blobContent1;
        logger.LogInformation("Blob sample-container/sample-blob-1 has been copied to sample-container/sample-blob-2");
    }
}

Wiązanie z kontrolkami TextReader i TextWriter

public static class BlobFunction_TextReader_TextWriter
{
    [FunctionName("BlobFunction")]
    public static async Task Run(
        [BlobTrigger("sample-container/sample-blob-1")] TextReader blobContentReader1,
        [Blob("sample-container/sample-blob-2")] TextWriter blobContentWriter2,
        ILogger logger)
    {
        while (blobContentReader1.Peek() >= 0)
        {
            await blobContentWriter2.WriteLineAsync(await blobContentReader1.ReadLineAsync());
        }
        logger.LogInformation("Blob sample-container/sample-blob-1 has been copied to sample-container/sample-blob-2");
    }
}

Wiązanie z typami zestawu SDK obiektów blob usługi Azure Storage

public static class BlobFunction_BlobClient
{
    [FunctionName("BlobFunction")]
    public static async Task Run(
        [BlobTrigger("sample-container/sample-blob-1")] BlobClient blobClient1,
        [Blob("sample-container/sample-blob-2")] BlobClient blobClient2,
        ILogger logger)
    {
        BlobProperties blobProperties1 = await blobClient1.GetPropertiesAsync();
        logger.LogInformation("Blob sample-container/sample-blob-1 has been updated on: {datetime}", blobProperties1.LastModified);
        BlobProperties blobProperties2 = await blobClient2.GetPropertiesAsync();
        logger.LogInformation("Blob sample-container/sample-blob-2 has been updated on: {datetime}", blobProperties2.LastModified);
    }
}

Uzyskiwanie dostępu do kontenera obiektów blob

public static class BlobFunction_AccessContainer
{
    [FunctionName("BlobFunction")]
    public static async Task Run(
        [BlobTrigger("sample-container/sample-blob")] Stream blobStream,
        [Blob("sample-container")] BlobContainerClient blobContainerClient,
        ILogger logger)
    {
        logger.LogInformation("Blobs within container:");
        await foreach (BlobItem blobItem in blobContainerClient.GetBlobsAsync())
        {
            logger.LogInformation(blobItem.Name);
        }
    }
}

Wyliczanie obiektów blob w kontenerze

public static class BlobFunction_EnumerateBlobs_Stream
{
    [FunctionName("BlobFunction")]
    public static async Task Run(
        [BlobTrigger("sample-container/sample-blob")] Stream blobStream,
        [Blob("sample-container")] IEnumerable<Stream> blobs,
        ILogger logger)
    {
        logger.LogInformation("Blobs contents within container:");
        foreach (Stream content in blobs)
        {
            using var blobStreamReader = new StreamReader(content);
            logger.LogInformation(await blobStreamReader.ReadToEndAsync());
        }
    }
}
public static class BlobFunction_EnumerateBlobs_BlobClient
{
    [FunctionName("BlobFunction")]
    public static void Run(
        [BlobTrigger("sample-container/sample-blob")] Stream blobStream,
        [Blob("sample-container")] IEnumerable<BlobClient> blobs,
        ILogger logger)
    {
        logger.LogInformation("Blobs within container:");
        foreach (BlobClient blob in blobs)
        {
            logger.LogInformation(blob.Name);
        }
    }
}

Konfigurowanie rozszerzenia

Zapoznaj się z przykładową aplikacją funkcji.

Rozwiązywanie problemów

Aby uzyskać wskazówki dotyczące rozwiązywania problemów, zapoznaj się z artykułem Monitorowanie Azure Functions.

Następne kroki

Przeczytaj wprowadzenie do funkcji platformy Azure lub przewodnik po tworzeniu funkcji platformy Azure.

Współtworzenie

Zobacz CONTRIBUTING.md Storage , aby uzyskać szczegółowe informacje na temat kompilowania, testowania i współtworzenia tej biblioteki.

W tym projekcie zachęcamy do współtworzenia i zgłaszania sugestii. Współtworzenie w większości przypadków wymaga zgody na umowę licencyjną dotyczącą współautorów (CLA, Contributor License Agreement), zgodnie z którą współautor ma prawo udzielić i faktycznie udziela nam praw do używania wytworzonej przez siebie zawartości. Aby uzyskać szczegółowe informacje, odwiedź cla.microsoft.com.

W tym projekcie przyjęto Kodeks postępowania oprogramowania Open Source firmy Microsoft. Aby uzyskać więcej informacji, zobacz Często zadawane pytania dotyczące kodeksu postępowania lub skontaktuj się z opencode@microsoft.com dodatkowymi pytaniami lub komentarzami.

Wrażenia