调用EmailClient.Send发件成功却触发x-ms-acsemail-geoforward-acsarmresourceid验证错误
问题描述
使用.NET NuGet包Azure.Communication.Email的EmailClient.Send方法发送邮件时,邮件已成功投递,但触发以下Azure.RequestFailedException异常:
Azure.RequestFailedException: '请求体验证错误。请查看属性'x-ms-acsemail-geoforward-acsarmresourceid'
状态码: 400 (Bad Request)
错误代码: BadRequest内容:
{"error":{"code":"BadRequest","message":"请求体验证错误。请查看属性'x-ms-acsemail-geoforward-acsarmresourceid'","target":null,"details":null,"innererror":null}}请求头:
mise-correlation-id: REDACTED
x-ms-error-code: REDACTED
api-supported-versions: REDACTED
X-Cache: REDACTED
Strict-Transport-Security: REDACTED
X-Azure-Ref: REDACTED
Date: Sat, 29 Jun 2024 21:53:45 GMT
Content-Length: 178
Content-Type: application/json; charset=utf-8
原因与解决步骤
核心原因
该错误与x-ms-acsemail-geoforward-acsarmresourceid请求头相关:当你的邮件服务资源和实际处理请求的Azure区域不一致时,会触发跨区域转发验证,若请求头未携带正确的目标资源ARM ID,就会抛出400错误。解决操作
获取资源ARM ID
登录Azure门户,进入对应的Communication Services资源,在「概览」页面的「资源ID」字段复制完整路径,格式示例:/subscriptions/{订阅ID}/resourceGroups/{资源组}/providers/Microsoft.Communication/emailServices/{资源名称}发送邮件时添加自定义请求头
使用EmailClient.Send的重载方法,通过RequestContext传入正确的资源ARM ID:var sendResult = emailClient.Send( wait: WaitUntil.Completed, senderAddress: "sender@yourdomain.com", recipientAddress: "recipient@targetdomain.com", subject: "测试邮件", plainTextContent: "这是一封测试邮件", requestContext: new RequestContext() { Headers = { { "x-ms-acsemail-geoforward-acsarmresourceid", "你的资源ARM ID" } } });检查区域配置
确认你的Email服务资源所在区域,若非业务必需,尽量避免跨区域转发;若必须跨区域,确保上述请求头的ARM ID完全匹配目标资源。
补充说明
邮件成功投递但抛出异常,是因为邮件投递流程已完成,但后续的跨区域验证请求失败。添加正确的资源ARM ID后,即可消除该错误。
内容的提问来源于stack exchange,提问作者foz1284

