Microsoft.Azure.WebJobs.Extensions.Storage.Blobs 5.3.1

前缀已保留
dotnet add package Microsoft.Azure.WebJobs.Extensions.Storage.Blobs --version 5.3.1                
NuGet\Install-Package Microsoft.Azure.WebJobs.Extensions.Storage.Blobs -Version 5.3.1                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage.Blobs" Version="5.3.1" />                
对于支持 包引用 的项目,将此 XML 节点复制到项目文件中以引用包。
paket add Microsoft.Azure.WebJobs.Extensions.Storage.Blobs --version 5.3.1                
#r "nuget: Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, 5.3.1"                
#r 指令可以在 F# Interactive 和 Polyglot Notebooks 中使用。将此内容复制到交互式工具或脚本的源代码中以引用包。
// Install Microsoft.Azure.WebJobs.Extensions.Storage.Blobs as a Cake Addin
#addin nuget:?package=Microsoft.Azure.WebJobs.Extensions.Storage.Blobs&version=5.3.1

// Install Microsoft.Azure.WebJobs.Extensions.Storage.Blobs as a Cake Tool
#tool nuget:?package=Microsoft.Azure.WebJobs.Extensions.Storage.Blobs&version=5.3.1                

Azure WebJobs Storage Blobs .NET 客户端库

此扩展提供了在 Azure Functions 进程中访问 Azure 存储块的功能。

入门

安装包

使用 NuGet 安装存储块扩展

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

先决条件

使用此包,您需要一个 Azure 账户 和一个 存储账户

要创建新的存储账户,您可以使用 Azure 门户Azure PowerShellAzure CLI。以下使用 Azure CLI 的示例:

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

认证客户端

为了使扩展可以使用 Blobs,您需要连接字符串,该字符串可以在Azure 站点中找到,或者通过以下Azure CLI 片段来获取。

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

连接字符串可以通过AzureWebJobsStorage 应用程序设置提供。

关键概念

使用 Blob 触发器

Blob 存储触发器会在检测到新的或更新的 blob 时启动函数。blob 的内容作为函数的输入提供。

请遵循教程来了解如何在 blob 被修改时触发 Azure 函数。

监听策略

Blob 触发器在监听 blob 的创建和修改方面提供了多种策略。可以通过指定 BlobTriggerSource 属性来自定义这些策略(请参阅下面的示例)。

默认策略

默认情况下,blob 触发器使用轮询,这是一种在检查Azure 存储分析日志和运行周期性容器扫描之间的混合方式。每次扫描10,000个 blob,并在时间间隔之间使用继续令牌。

默认情况下,未启用Azure 存储分析日志,有关如何启用它的信息,请参阅Azure 存储分析日志

此策略不建议用于高流量应用程序或需要低延迟的场景。

事件网格

可以使用Blob 存储事件来监听更改。此策略需要额外设置

此策略推荐用于高流量应用程序。

使用 Blob 绑定

输入绑定允许您将 blob 存储数据作为 Azure 函数的输入读取。输出绑定允许您在 Azure 函数中修改和删除 blob 存储数据。

请遵循输入绑定教程输出绑定教程来了解如何使用此扩展来访问 Blobs。

示例

响应 blob 更改

默认策略
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());
    }
}
事件网格策略
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());
    }
}

从流中读取

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());
    }
}

写入流

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");
    }
}

绑定到字符串

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);
    }
}

将字符串写入 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");
    }
}

绑定到字节数组

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));
    }
}

将字节数组写入 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");
    }
}

绑定到 TextReader 和 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");
    }
}

绑定到 Azure Storage Blob SDK 类型

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);
    }
}

访问 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);
        }
    }
}

枚举容器中的 blob

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);
        }
    }
}

配置扩展

请参阅示例函数应用程序

故障排除

请参阅监控 Azure 函数以获取故障排除指南。

下一步

阅读Azure 函数简介创建 Azure 函数指南

贡献

有关构建、测试和向此库贡献的详细信息,请参阅Storage CONTRIBUTING.md

本项目欢迎贡献和建议。大多数贡献都需要您同意《贡献者许可协议》(CLA),声明您有授权,并且实际授权我们使用您的贡献。有关详情,请访问cla.microsoft.com

本项目采用了微软开源行为准则。更多信息请参阅行为准则常见问题解答,或联系[email protected]提出额外的问题或反馈。

产品 兼容的和额外计算的目标框架版本。
.NET net5.0已计算。 net5.0-windows已计算。 net6.0已计算。 net6.0-android已计算。 net6.0-ios已计算。 net6.0-maccatalyst已计算。 net6.0-macos已计算。 net6.0-tvos已计算。 net6.0-windows已计算。 net7.0已计算。 net7.0-android已计算。 net7.0-ios已计算。 net7.0-maccatalyst已计算。 net7.0-macos已计算。 net7.0-tvos已计算。 net7.0-windows已计算。 net8.0已计算。 net8.0-android已计算。 net8.0-browser已计算。 net8.0-ios已计算。 net8.0-maccatalyst已计算。 net8.0-macos已计算。 net8.0-tvos已计算。 net8.0-windows已计算。
.NET Core netcoreapp2.0已计算。 netcoreapp2.1已计算。 netcoreapp2.2已计算。 netcoreapp3.0已计算。 netcoreapp3.1已计算。
.NET Standard netstandard2.0 兼容。 netstandard2.1 已计算。
.NET 框架 net461 已计算。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。
MonoAndroid monoandroid 已计算。
MonoMac monomac 已计算。
MonoTouch monotouch 已计算。
Tizen tizen40 已计算。 tizen60 已计算。
Xamarin.iOS xamarinios 已计算。
Xamarin.Mac xamarinmac 已计算。
Xamarin.TVOS xamarintvos 已计算。
Xamarin.WatchOS xamarinwatchos 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解更多关于 目标框架.NET Standard 的信息。

NuGet 包 (2)

显示依赖 Microsoft.Azure.WebJobs.Extensions.Storage.Blobs 的前 2 个 NuGet 包

下载
Microsoft.Azure.WebJobs.Extensions

此扩展为 Storage 添加绑定

IglooSoftware.Sdk.EventSourcing

Igloo Event Sourcing SDK 用于服务。

GitHub 存储库 (1)

显示依赖 Microsoft.Azure.WebJobs.Extensions.Storage.Blobs 的前 1 个最受欢迎的 GitHub 存储库

存储库 星级
Azure-Samples/Serverless-microservices-reference-architecture
本参考架构通过直观的说明,带您了解使用微服务架构设计、开发和交付无服务器应用程序时涉及的决策过程。包括沿途配置和部署所有架构组件的动手操作指南。目标是提供在多个Azure服务中有效使用它们,并协同统一地构建基于无服务器的微服务架构的实际动手经验。
版本: 下载 上次更新:
5.3.1 51,925 7/17/2024
5.3.0 457,632 4/19/2024
5.3.0-beta.1 471 4/16/2024
5.2.2 1,006,374 12/12/2023
5.2.1 947,155 9/25/2023
5.2.0 541,649 8/29/2023
5.1.3 930,234 6/26/2023
5.1.2 807,124 4/28/2023
5.1.1 453,852 3/24/2023
5.1.0 415,680 2/22/2023
5.1.0-beta.1 16,425 2/8/2023
5.0.1 6,027,830 5/3/2022
5.0.0 4,045,397 10/26/2021
5.0.0-beta.5 119,449 7/9/2021
5.0.0-beta.4 29,775 5/18/2021
5.0.0-beta.3 17,565 3/10/2021
5.0.0-beta.2 20,244 2/10/2021
5.0.0-beta.1 32,367 11/10/2020