推荐使用 EventGridPublisherClient(azure.Messaging.EventGrid),支持 DefaultAzureCredential 认证,自动处理 httpS/json,需确保主题就绪、权限正确,并用 EventGridEvent 格式构造事件。

用 EventGridPublisherClient 发布事件最直接
Azure SDK v4+ 推荐用 EventGridPublisherClient(来自 Azure.ResourceManager.EventGrid 或更轻量的 Azure.Messaging.EventGrid),它比老版 microsoft.Azure.EventGrid 更简洁、支持 Azure Identity 认证,且默认走 https + JSON。
关键点:你不需要手动构造 HTTP 请求或管理 SAS 密钥(除非用自定义主题且坚持用密钥认证);用托管身份或服务主体更安全。
- 安装包:
Azure.Messaging.EventGrid(.NET 5+ 推荐)或Azure.ResourceManager.EventGrid(若需资源管理操作) - 发布端点是主题的
endpoint(形如https://<topic-name>.<region>.eventgrid.azure.net/api/events) - 认证方式优先选
DefaultAzureCredential,本地开发用 Azure CLI 登录即可自动生效
构造事件对象要注意 eventType 和 dataVersion
Event Grid 要求每个事件是 CloudEvent 或 EventGridEvent 格式。推荐用 EventGridEvent,因为它是 Azure 原生格式,兼容性更好,且 EventGridPublisherClient 默认接受它。
eventType 不是随意起名——订阅方靠它路由和过滤;dataVersion 影响反序列化逻辑,建议设为 "1.0" 并保持全系统统一。
-
subject应体现资源路径(如/app/users/123),方便订阅方做前缀匹配 -
id建议用Guid.NewGuid().ToString(),避免重复;Event Grid 不去重,重复 ID 可能被当成新事件 -
data字段必须是JsonElement、string或Object(后者会被自动 JSON 序列化)
调用 SendEventsAsync 前检查主题是否就绪
常见失败不是代码问题,而是主题未部署成功或未授权发布权限。错误信息如 "Unauthorized" 或 "Topic not found" 往往指向配置问题,而非 SDK 调用本身。
- 确认主题状态为
Running(在 Portal 或用az eventgrid topic show查) - 若用托管身份,确保该身份对主题有
EventGrid EventSubscription Contributor或至少Microsoft.EventGrid/topics/publish/action权限 - 若用密钥,从 Portal 复制的是“密钥1”,别误用“密钥2”或过期密钥;密钥需 Base64 解码后参与签名(SDK 已封装,但自己拼 URL 时容易错)
- 批量发送最多 100 个事件/请求;单个事件 payload 不超过 1 MB
本地调试时 DefaultAzureCredential 不生效怎么办
典型现象:本地运行报 "No managed identity endpoint found" 或 "Failed to get Token from Azure CLI"。这不是代码 bug,而是凭证链断了。
- 先运行
az login,再az account set --subscription <your-sub-id> - 确保已安装 Azure CLI 2.30+,且登录账号对目标 Event Grid 主题有权限
- 若用 VS 调试,勾选“使用 Azure Active Directory 进行身份验证”(项目属性 → Debug → App Service Authentication)
- 临时方案:开发阶段可改用
new AzureKeyCredential(<key>)+new EventGridPublisherClient(endpoint, credential),但切勿提交密钥到代码库
真正上线时,密钥硬编码会成为安全短板;而托管身份一旦配错权限,错误信息又很模糊——这时候得回头查 RBAC 分配是否精确到资源级别,而不是组级别。