当我 create/update/delete 日历时收到两次 outlook 休息推送通知

Receiving outlook rest push notification twice, when I create/update/delete the calender

我有一个要求,我需要在任何日历项目 created/updated/deleted 时收到通知。我按照 Outlook push notification documentation 订阅了日历通知。

我已成功订阅日历活动。但是每当我创建一个新日历时,我都会收到两次通知。 以下是通知请求数据。

第一个通知请求数据:

{
    "value": [{
        "@odata.type": "#Microsoft.OutlookServices.Notification",
        "Id": null,
        "SubscriptionId": "OTA0N0MwQj==",
        "SubscriptionExpirationDateTime": "2017-09-27T05:30:49.6163119Z",
        "SequenceNumber": 1,
        "ChangeType": "Created",
        "Resource": "https://outlook.office.com/api/v2.0/Users('1520ed5a')/Events('AAMkADAzNDUxODY=')",
        "ResourceData": {
            "@odata.type": "#Microsoft.OutlookServices.Event",
            "@odata.id": "https://outlook.office.com/api/v2.0/Users('1520ed5a')/Events('AAMkADAzNDUxODY=')",
            "@odata.etag": "W/\"DwAAABYAAAB4h4N+ELBRSbQKq1A05YT8AADcUdIx\"",
            "Id": "AAMkADAzNDUxOD="
        }
    }]
}

第二次通知请求数据:

{
    "value": [{
        "@odata.type": "#Microsoft.OutlookServices.Notification",
        "Id": null,
        "SubscriptionId": "OTA0N0MwQj==",
        "SubscriptionExpirationDateTime": "2017-09-27T05:30:49.6163119Z",
        "SequenceNumber": 2,
        "ChangeType": "Updated",
        "Resource": "https://outlook.office.com/api/v2.0/Users('1520ed5a')/Events('AAMkADAzNDUxODY=')",
        "ResourceData": {
            "@odata.type": "#Microsoft.OutlookServices.Event",
            "@odata.id": "https://outlook.office.com/api/v2.0/Users('1520ed5a')/Events('AAMkADAzNDUxODY=')",
            "@odata.etag": "DwAAABYAAAB4h4N+ELBRSbQKq1A05YT8AADcUdIy\"",
            "Id": "AAMkADAzNDUxOD="
        }
    }]
}

如果您观察两个请求数据,在第一个请求数据中它显示 ChangeType 作为 Created,在第二个请求数据中它显示 ChangeType 作为 Updated

当我更新或删除日历时出现相同的行为(收到两次通知)。

知道如何摆脱第二次通知吗?

这不是预期的行为,我自己也无法复制它。我最好的猜测是您有一些 other 系统监视日历并自动编辑日历事件。这可以解释为什么您在 create 操作后几乎立即获得更新。

在同步方面,建议使用 Microsoft Graph API 的 /delta 功能。当您收到通知时,您只需拉取 /delta 和 return 仅已更改的记录。如果您收到错误通知,这将消除重复处理,因为您的第二个 /delta 的结果将为空。如果您有更改,但不是您关心的 属性,则您可以丢弃结果并消除对数据存储的任何不必要的写入。