Google日历推送通知回调疑难解答

时间:2017-04-03 10:55:23

标签: c# calendar google-calendar-api google-api-dotnet-client

我已经实现了一个c#app,它使用日历API创建日历事件。

为了使日历与我们的本地数据库保持同步,我在日历上创建了一个手表。以下代码执行此操作,并且据我所知,创建了一个监视。

Channel watchChannel = new Channel()
{
    Id = ConfigurationManager.AppSettings["GOOGLE_CALENDAR_WATCH_NAME"],
    Type = "web_hook",
    Address = ConfigurationManager.AppSettings["GOOGLE_CALENDAR_SYNC_TRIGGER_CALLBACK_URL"],
    Expiration = (unixTimestamp + NINETY_DAYS_IN_SECONDS) * 1000 //milliseconds
};

try
{
    logger.Debug("Creating calendar watch with the name " +
                 ConfigurationManager.AppSettings["GOOGLE_CALENDAR_WATCH_NAME"] + " for calendar with id " + remoteCalendarId);
    Channel returnChannel = service.Events.Watch(watchChannel, remoteCalendarId).Execute();

我的问题是没有调用回调URL(我已经确认了域的所有权并为用户进行了身份验证,这应该不是问题)。

  • 我该如何调试?有什么地方我可以看看谷歌的尝试 打电话给回拨网址?
  • 我说,据我所知,一切都是好的,但也许我错了,在哪个属性 我应该看看returnChannel吗?
  • 有没有办法列出特定日历的所有创建的手表/频道?如果是,那么通过哪个API公开?

04.04 - 更多信息:

这些是在拨出电话(watchChannel)和return-object(returnChannel)上设置的参数。

watchChannel

returnChannel

再看一遍,我还有一些问题:

  • 我可以确定上面的内容返回了HTTP-200响应吗?客户端库似乎抽象出实际的请求/响应,我在我正在查看的对象中找不到它的任何痕迹。正如我所获得的4xx响应已被转换为异常,这是我对任何非200响应的期望,但我能确定吗?
  • 是否真的无法跟踪谷歌在调用回调网址时所做的尝试?由于似乎没有办法获得一个创建的手表,有点让我感到惊讶的是我没有GUI可以跟踪它。真的很难找到错误。

验证代码

我使用以下代码对系统用户进行身份验证,然后以“正常”非系统帐户的形式进行操作(因为如果您真的想看一下纯粹的系统帐户似乎是一个棘手的方法日历也是如此。

ServiceAccountCredential credential = 
    GoogleCredential.FromJson(GOOGLE_SYSTEM_USER_AUTH_INFORMATION)
        .CreateScoped(Scopes)
        .UnderlyingCredential as ServiceAccountCredential;

var userField =
    typeof(ServiceAccountCredential).GetField("user", BindingFlags.NonPublic | BindingFlags.Instance);
userField?.SetValue(credential, GOOGLE_CALENDAR_USERNAME); //Act in the guise of the normal user GOOGLE_CALENDAR_USERNAME


service = new CalendarService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = ApplicationName,
});

一时兴起我访问了返回的ResourceURI。它给了我

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }
}

  • 这个手表的状态?如果是这样的话,为什么我在制作时没有获得403?
  • 我真的没有身份验证,还是只是通过浏览器提出请求?

1 个答案:

答案 0 :(得分:0)

回调URL必须为https(证书),否则将不会被调用!