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
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage.Blobs" Version="5.3.1" />
paket add Microsoft.Azure.WebJobs.Extensions.Storage.Blobs --version 5.3.1
#r "nuget: Microsoft.Azure.WebJobs.Extensions.Storage.Blobs, 5.3.1"
// 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 PowerShell 或 Azure 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 的创建和修改方面提供了多种策略。可以通过指定 BlobTrigger
的 Source
属性来自定义这些策略(请参阅下面的示例)。
默认策略
默认情况下,blob 触发器使用轮询,这是一种在检查Azure 存储分析日志和运行周期性容器扫描之间的混合方式。每次扫描10,000个 blob,并在时间间隔之间使用继续令牌。
默认情况下,未启用Azure 存储分析日志,有关如何启用它的信息,请参阅Azure 存储分析日志。
此策略不建议用于高流量应用程序或需要低延迟的场景。
事件网格
此策略推荐用于高流量应用程序。
使用 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 函数以获取故障排除指南。
下一步
贡献
有关构建、测试和向此库贡献的详细信息,请参阅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 已计算。 |
-
.NETStandard 2.0
- Azure.Storage.Blobs (>= 12.21.0)
- Azure.Storage.Queues (>= 12.19.0)
- Microsoft.Azure.WebJobs (>= 3.0.37)
- Microsoft.Extensions.Azure (>= 1.7.4)
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 |