Google Calendar新事件触发外部日程更新及C#事件获取排查
Google Calendar新事件触发与代码问题排查
问题
- 当Google Calendar创建新事件时,如何获取触发信号来更新自有应用中的外部日程?
- 以下代码无法获取新事件,问题出在哪里?
现有代码
public async Task<List<EventModel>> GetAllEventsAsync() { var refresToken = RetrieveRefreshTokenAndRevoke.RefreshToken(); if (refresToken == "ok") { var tokens = JObject.Parse(System.IO.File.ReadAllText(ConstantJsonFileLink.TOKEN)); RestClient restClient = new RestClient(new Uri("https://www.googleapis.com/calendar/v3/calendars/primary/events")); RestRequest restRequest = new RestRequest(Method.GET); restRequest.AddQueryParameter("key", $"{ApiKey}"); restRequest.AddHeader("Authorization", "Bearer " + tokens["access_token"]); restRequest.AddHeader("Accept", "application/json"); try { var response = await restClient.ExecuteAsync(restRequest); if (response.StatusCode == System.Net.HttpStatusCode.OK) { JObject calendarEvents = JObject.Parse(response.Content); var allEvents = calendarEvents["items"].ToObject<List<EventModel>>(); return allEvents; } } catch (Exception ex) { throw new Exception("Coulden't connect to google agenda."); } } return null; }
代码问题分析
- 未做增量过滤:当前代码全量拉取所有事件,但未指定
updatedMin参数(仅拉取某个时间点后更新的事件),若新事件因API分页或默认返回范围限制,会被遗漏。 - 冗余的API Key参数:使用OAuth2的Bearer Token访问用户私有日历数据时,无需添加
key参数(API Key用于无授权的公共数据访问),两者同时使用可能引发权限冲突。 - 错误处理不完整:仅捕获异常,但未处理非200状态码的响应(比如401令牌过期、403权限不足),也未输出响应内容,无法排查API返回的具体错误。
- EventModel映射风险:如果
EventModel的属性名称、类型与Google Calendar API返回的JSON字段不匹配(比如start/end是嵌套对象,而模型未正确定义),会导致反序列化失败,返回空列表或丢失事件。 - RefreshToken逻辑模糊:仅通过返回"ok"判断令牌刷新成功,但未验证新的access_token是否有效,可能使用过期或无效的令牌发起请求。
获取新事件触发信号的正确方式
不要使用定时轮询(效率低、延迟高),应采用Google Calendar的推送通知(Push Notifications):
- 配置一个可公网访问的HTTP端点作为Webhook回调地址。
- 调用Google Calendar API的
watch方法(POST https://www.googleapis.com/calendar/v3/calendars/primary/events/watch),订阅日历事件变更,指定回调URL、唯一ID、过期时间等参数。 - 当日历有新事件创建/更新/删除时,Google会向回调地址发送POST请求,包含变更事件的相关信息。
- 收到通知后,调用API并通过
updatedMin参数拉取最近变更的事件,更新自有应用的日程。
内容的提问来源于stack exchange,提问作者Wannes Limbourg
相关产品推荐
相关产品推荐

