使用MS Graph创建日历事件无报错但无效果,求排查方案
问题分析与解决方案
核心问题:异步方法未等待
你的代码中调用PostAsync时未使用await关键字,这是事件未创建的关键原因。PostAsync是异步方法,程序执行到此处会直接继续推进,而同步的Main方法会直接退出进程,导致Graph请求还未完成就被终止。
修复步骤
- 将Main方法改为异步
把static void Main替换为static async Task Main,允许在方法内使用await等待异步操作完成。 - 等待PostAsync执行完毕
在调用PostAsync前添加await,确保请求完成后程序才退出;同时增加异常捕获,排查潜在的隐藏错误。
修复后的完整代码
using Azure.Identity; using Microsoft.Graph; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.Json; using Microsoft.Graph.Models; using Microsoft.Identity.Client; using static System.Formats.Asn1.AsnWriter; using System.Threading.Tasks; namespace PopulateCalendar { internal class Program { static async Task Main(string[] args) { var config = new ConfigurationBuilder() .SetBasePath(AppDomain.CurrentDomain.BaseDirectory) .AddJsonFile("appsettings.json") .Build(); var credentials = new ClientSecretCredential ( config["GraphCalendar:TenantId"], config["GraphCalendar:ClientId"], config["GraphCalendar:ClientSecret"], new TokenCredentialOptions { AuthorityHost = AzureAuthorityHosts.AzurePublicCloud } ); string OrganizerEmail = "purchasing@cantonfoodco.com"; GraphServiceClient graphServiceClient = new GraphServiceClient(credentials); var requestBody = new Event { Subject = "Event Subject", Body = new ItemBody { ContentType = BodyType.Html, Content = "What the event is about", }, Start = new DateTimeTimeZone { DateTime = "2024-11-29T10:00:00", TimeZone = "Pacific Standard Time", }, End = new DateTimeTimeZone { DateTime = "2024-11-29T14:00:00", TimeZone = "Pacific Standard Time", }, Location = new Location { DisplayName = "Location of Event", }, TransactionId = "7E163156-7762-4BEB-A1C6-729EA81755A7", }; try { // 等待异步请求完成 var createdEvent = await graphServiceClient.Users[config["GraphCalendar:UserObjectId"]] .Calendars["AQMkAGEzZDM0OTY5LWMzMjgtNGIxMy05ZWQ4LWM0MzZmYjY3NwA0YzUARgAAA4FoDJtpplFKsFjbsbk87SMHAPRwDiDSU_BCkOt4FQfkqmQAAAIBBgAAAPRwDiDSU_BCkOt4FQfkqmQAAAITCgAAAA=="] .Events .PostAsync(requestBody); // 可选:输出事件ID确认操作成功 Console.WriteLine($"事件创建成功,ID:{createdEvent.Id}"); } catch (Exception ex) { // 捕获异常排查隐藏问题 Console.WriteLine($"创建事件失败:{ex.Message}"); if (ex.InnerException != null) { Console.WriteLine($"内部异常:{ex.InnerException.Message}"); } } } } }
额外检查点
- Calendar ID有效性:通过调用
graphServiceClient.Users[userId].Calendars.GetAsync()获取目标用户的所有日历列表,确认当前使用的Calendar ID无误。 - 应用权限确认:因使用客户端凭据流,需确保Azure AD中已授予
Calendars.ReadWrite应用权限(非委派权限),且已完成管理员同意。 - 时区格式验证:确认
"Pacific Standard Time"是有效的Windows时区ID,也可尝试使用IANA时区(如"America/Los_Angeles"),Graph兼容两种格式。
内容的提问来源于stack exchange,提问作者Tony Bass
相关产品推荐
相关产品推荐

