Azure Functions隔离进程:如何从BlobInput获取CloudBlobContainer写入Blob
在Azure Functions隔离模式中操作Blob容器写入数据
在隔离托管模式下,Azure Functions的绑定系统不再直接返回CloudBlobContainer这类旧版Storage SDK对象(Microsoft.Azure.Storage.Blob),而是通过简化的输入输出绑定处理数据。如果需要向Blob容器写入新文件,推荐使用新版Azure.Storage.Blobs SDK直接操作,步骤如下:
1. 安装依赖包
首先安装官方的Blob存储SDK:
Install-Package Azure.Storage.Blobs
2. 通过依赖注入配置BlobServiceClient
在隔离模式中,推荐通过依赖注入注入BlobServiceClient,避免重复创建客户端实例,提升连接复用效率:
修改Program.cs配置依赖注入
using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Azure.Storage.Blobs; var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { // 从配置读取存储连接字符串,注入单例BlobServiceClient services.AddSingleton(x => new BlobServiceClient( x.GetRequiredService<IConfiguration>()["StateStorageConnectionString"])); }) .Build(); host.Run();
3. 修改函数实现写入逻辑
移除不需要的[BlobInput]绑定(若无需读取现有Blob内容),通过注入的BlobServiceClient获取目标容器,完成Blob写入操作:
using System; using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; namespace sample { public class SampleFunctionApp { private readonly ILogger _logger; private readonly BlobServiceClient _blobServiceClient; // 构造函数注入BlobServiceClient public SampleFunctionApp(ILoggerFactory loggerFactory, BlobServiceClient blobServiceClient) { _logger = loggerFactory.CreateLogger<SampleFunctionApp>(); _blobServiceClient = blobServiceClient; } [Function("SampleFunctionApp")] public async Task Run([EventHubTrigger("eventhubname", Connection = "conn-string")] string[] input, FunctionContext context) { _logger.LogInformation($"First Event Hubs triggered message: {input[0]}"); // 获取目标容器(不存在则自动创建) var blobContainerClient = _blobServiceClient.GetBlobContainerClient("your-target-container"); await blobContainerClient.CreateIfNotExistsAsync(); // 创建Blob客户端,指定唯一文件名 var blobClient = blobContainerClient.GetBlobClient($"event-data-{Guid.NewGuid()}.txt"); // 将EventHub消息写入Blob var contentBytes = Encoding.UTF8.GetBytes(input[0]); using var contentStream = new MemoryStream(contentBytes); await blobClient.UploadAsync(contentStream, new BlobHttpHeaders { ContentType = "text/plain" }); _logger.LogInformation($"Successfully wrote message to blob: {blobClient.Uri}"); } } }
关键说明
- 隔离模式不支持直接绑定到
CloudBlobContainer,旧版Microsoft.Azure.Storage.BlobSDK已被官方弃用,推荐使用Azure.Storage.BlobsSDK完成所有Blob操作。 BlobServiceClient是线程安全的,通过依赖注入单例管理可复用连接池,提升函数运行性能。- 若需读取现有Blob内容,仍可使用
[BlobInput]绑定获取字符串/流,但写入操作必须通过SDK实现。
内容的提问来源于stack exchange,提问作者vaisakh raveendran
相关产品推荐
相关产品推荐

