C#中访问Google Calendar API v3公共日历出现404错误
解决Google Calendar API客户端库404 Not Found错误
我来帮你排查这个问题——你提到直接用GET请求调用API时,API密钥和Calendar ID都能正常工作,但用.NET客户端库就抛出404错误,这大概率是客户端库的细节处理或者参数格式的问题,下面是具体的排查和修复方案:
可能的原因及修复步骤
1. Calendar ID的编码问题
你代码里的Calendar ID包含%40(URL编码后的@符号),但Google .NET客户端库会自动处理URL编码,如果你提前编码了Calendar ID,会导致双重编码,服务器无法识别对应的日历资源,从而返回404。
修复方法:使用原始未编码的Calendar ID:
var calendarId = "thefirstacademy.org_2ldo8np1v5tr1qlpbho6ip6tog@group.calendar.google.com";
2. 修正ApplicationName的取值
你的代码里把ApplicationName设为了API Key的名称,这不符合最佳实践——ApplicationName应该是你的应用程序名称(比如"My Calendar Viewer"),虽然这不是404的直接原因,但修正后能避免潜在的请求标识问题。
3. 兼容全天事件的字段处理(避免后续异常)
公共日历的事件可能是全天事件,这类事件不会有DateTime字段,而是用Date字段存储时间。你直接调用myEvent.Start.DateTime.ToString()会抛出空引用异常,提前处理可以避免后续问题。
修改后的完整代码
class Program { static void Main(string[] args) { var service = new CalendarService(new BaseClientService.Initializer() { ApiKey = "My API Key From Google Console", ApplicationName = "Your Application Name", // 替换为你的应用名称 }); // 使用未编码的原始Calendar ID var calendarId = "thefirstacademy.org_2ldo8np1v5tr1qlpbho6ip6tog@group.calendar.google.com"; var eventsRequest = service.Events.List(calendarId); // 可选:展开重复事件为单个事件(公共日历常用) eventsRequest.SingleEvents = true; try { var events = eventsRequest.Execute(); foreach (var myEvent in events.Items) { // 兼容DateTime和Date两种时间格式 var startTime = myEvent.Start.DateTime.HasValue ? myEvent.Start.DateTime.Value.ToString() : myEvent.Start.Date; var endTime = myEvent.End.DateTime.HasValue ? myEvent.End.DateTime.Value.ToString() : myEvent.End.Date; Console.WriteLine($"Event: {myEvent.Summary} Start: {startTime} End: {endTime}"); } } catch (GoogleApiException ex) { // 打印详细错误信息,方便排查 Console.WriteLine($"API请求错误: {ex.Message}"); Console.WriteLine($"状态码: {ex.HttpStatusCode}"); if (ex.Error?.Errors != null) { foreach (var errorDetail in ex.Error.Errors) { Console.WriteLine($"错误原因: {errorDetail.Reason} | 域: {errorDetail.Domain}"); } } } } }
额外排查建议
如果修改后还是报错,可以通过以下方式确认请求是否正确:
- 捕获异常时打印客户端库生成的请求URL,和你直接测试的GET请求URL对比,看是否存在差异;
- 再次确认Google Cloud Console中,你的项目是否已经启用了Calendar API(虽然直接GET能成功,但客户端库的请求可能关联项目的服务状态)。
内容的提问来源于stack exchange,提问作者Michael Maxime
相关产品推荐
相关产品推荐

