You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:07:51