使用Microsoft Graph SDK C#创建订阅时遇必填字段报错问题
以下是具体排查步骤:
检查Resource字段的合法性
你使用的是Resource = "me/messages",但当前客户端是通过ClientSecretCredential以应用身份发起请求,me仅代表用户身份上下文的当前用户,应用身份下没有默认的"当前用户",所以这个Resource值无效。应该替换为具体用户的ID,比如users/{user-object-id}/messages,否则请求会存在上下文错误,可能导致错误信息不准确。验证expirationDateTime的序列化情况
代码里虽然设置了ExpirationDateTime = DateTimeOffset.Now.AddMinutes(3500),但可以通过打印请求内容确认该字段是否被正确序列化:var webhookDataResult1 = graphClient.Subscriptions.ToPostRequestInformation(webhook); // 打印请求体内容 var requestBody = System.Text.Json.JsonSerializer.Deserialize<dynamic>(webhookDataResult1.Content); Console.WriteLine(requestBody);如果输出的JSON里没有
expirationDateTime字段,说明SDK没有正确序列化该属性,此时需要检查Microsoft.Graph NuGet包版本,更新到最新稳定版(避免旧版本的序列化bug)。确认订阅有效期是否符合要求
Microsoft Graph针对不同资源类型的订阅有最大有效期限制,邮件订阅的应用权限场景下最大有效期为7天(10080分钟),你设置的3500分钟(约58小时)在范围内,但建议直接使用DateTimeOffset.UtcNow来生成时间(确保是UTC时间,Graph要求UTC格式):ExpirationDateTime = DateTimeOffset.UtcNow.AddMinutes(3500),检查应用权限配置
确保你的应用已在Azure AD中授予Mail.ReadBasic.All或Mail.Read的应用权限,且已完成管理员同意。权限不足可能导致请求被拦截,返回的错误信息可能存在误导性。
内容的提问来源于stack exchange,提问作者Hardik Masalawala

