如何用Azure.ResourceManager.EventGrid为存储账户编程创建事件订阅
使用Azure.ResourceManager.EventGrid创建存储账户BlobCreated事件订阅
以下是用Azure.ResourceManager.EventGrid SDK实现你给出的Azure CLI命令等效功能的代码示例,适配批量给存储账户创建事件订阅的场景:
前置依赖
确保项目已安装对应NuGet包:
Install-Package Azure.ResourceManager.EventGrid Install-Package Azure.ResourceManager.Storage Install-Package Azure.Identity
核心实现代码
using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.EventGrid; using Azure.ResourceManager.EventGrid.Models; using System.Collections.Generic; public async Task CreateStorageBlobEventSubscriptionAsync( string storageAccountResourceId, string eventSubscriptionName, string azureFunctionEndpointUrl) { // 初始化ArmClient(自动适配本地CLI/VS、Azure托管环境的身份验证) var armClient = new ArmClient(new DefaultAzureCredential()); // 获取目标存储账户的资源对象 var storageAccountResource = armClient.GetGenericResource(new ResourceIdentifier(storageAccountResourceId)); await storageAccountResource.GetAsync(); // 构建事件订阅配置 var eventSubscriptionData = new EventSubscriptionData() { // 指定Azure Function作为事件接收端点 Destination = new WebHookEventSubscriptionDestination() { EndpointUrl = new Uri(azureFunctionEndpointUrl) }, // 设置事件过滤规则 Filter = new EventSubscriptionFilter() { // 仅监听BlobCreated事件 IncludedEventTypes = new List<string>() { "Microsoft.Storage.BlobCreated" }, // 限定只处理指定容器下的Blob事件 SubjectBeginsWith = "/blobServices/default/containers/container/blobs/", // 配置高级过滤条件 AdvancedFilters = new List<AdvancedFilter>() { // 仅接收指定API操作触发的事件 new StringInAdvancedFilter("data.api", new List<string>() { "CopyBlob", "PutBlob", "PutBlockList", "FlushWithClose", "CreateFile" }), // 过滤掉内容长度为0的Blob事件 new NumberGreaterThanAdvancedFilter("data.contentLength", 0) } } }; // 创建或更新事件订阅 var eventSubscriptionCollection = storageAccountResource.GetEventSubscriptions(); await eventSubscriptionCollection.CreateOrUpdateAsync( WaitUntil.Completed, eventSubscriptionName, eventSubscriptionData); }
关键细节说明
- 身份验证:
DefaultAzureCredential会自动识别运行环境的身份信息,无需手动配置密钥,适配本地开发、Azure云服务等多种场景。 - 过滤规则映射:代码中的配置完全对应你给出的CLI参数:
SubjectBeginsWith匹配--subject-begins-withStringInAdvancedFilter匹配--advanced-filter data.api StringIn ...NumberGreaterThanAdvancedFilter匹配--advanced-filter data.contentLength NumberGreaterThan 0
- 事件源定位:通过存储账户的资源ID获取资源对象,以此为入口创建事件订阅,符合Azure资源管理的层级逻辑。
批量处理示例
如果要给多个存储账户批量创建订阅,直接循环调用上述方法即可:
// 待处理的存储账户资源ID列表 var storageAccountIds = new List<string> { "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Storage/storageAccounts/account1", "/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Storage/storageAccounts/account2" }; // Azure Function的事件网格触发端点 var functionEndpoint = "https://your-function-app.azurewebsites.net/runtime/webhooks/eventgrid?functionName=your-function&code=xxx"; var subscriptionNamePrefix = "BlobCreated-To-Function"; foreach (var storageId in storageAccountIds) { var subscriptionName = $"{subscriptionNamePrefix}-{Path.GetFileName(storageId)}"; await CreateStorageBlobEventSubscriptionAsync(storageId, subscriptionName, functionEndpoint); }
内容的提问来源于stack exchange,提问作者Enrique Dev
相关产品推荐
相关产品推荐

