创建 Webhook 以跟踪 Asana 任务的变化

Create Webhook to tracking change of Asana Task

现在我正在尝试在 Asana 中设置一个网络挂钩,以便向我发送 Asana 项目中特定任务的事件更新。我是新手,所以在阅读和回答时请记住这一点,谢谢。这也是我在这里的第一个 post,所以请放轻松。这是我的代码,我是 运行.

收到通知的 WCF:

public string ReceiveHooks(Stream JSONdataStream)
{

    IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest;
    WebHeaderCollection headers = request.Headers;

    if (headers.AllKeys.Contains("X-Hook-Secret"))
    {
        var key = headers["X-Hook-Secret"];

        WebOperationContext.Current.OutgoingResponse.Headers.Add("X-Hook-Secret", key);
        WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.OK;

    }

    //Handle Json body

    using (var reader = new StreamReader(JSONdataStream))
    {
        List<AsanaEvent> listEvent = null;
        string values = reader.ReadToEnd();

        logger.Info("Asana receive hook successful: " + values);
        return "true";
    }

    return "False";
}

我创建 Webhook 的请求:

var client = new RestClient("https://app.asana.com/api/1.0/webhooks");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddHeader("authorization", "Bearer 0/<key>");
request.AddParameter("application/x-www-form-urlencoded", "resource=234806314393357&target=https%3A%2F%2Fmywebservice.com%2FWCFService.svc%2FReceiveHooks", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

我可以收到HookId:

 {
"data": {
    "id": 235053304,
    "target": "https://myservice.com/WCFService.svc/ReceiveHooks",
    "active": true,
    "created_at": "2016-12-22T16:02:29.899Z",
    "last_failure_at": null,
    "last_failure_content": "",
    "last_success_at": null,
    "resource": {
      "id": 2349951,
      "name": "My Task Name"
    }
  }
}

但是当我尝试通过 Id 获取 webhook 时,我收到错误消息:

"message": "webhook: Unknown object: 235053304"

有人知道这个错误信息吗? 我假设握手和处理接收钩子的代码在同一个地方。?

非常感谢

我是 Asana 的开发倡导者。这很奇怪;在我看来,你做的事情是正确的...

可以肯定的是,因为 webhook 可能很棘手,您正在经历这样的握手:

  • 请求 1 到 Asana:POST 到 app.asana.com/api/1.0/webhooks;这会阻止
    • Req2 到目标:POST 从 Asana 到你的目标
    • 来自目标的 Res2:200 OK 相同 X-Hook-Secret header
  • Asana 的 Res1:200 OK,上面列出的数据

然后你从 app.asana.com/api/1.0/webhooks/{webhook-id} 获取,你得到错误?

在那种情况下,除了出现错误外,其他一切似乎都是完全正常的。当您在 app.asana.com/api/1.0/webhooks 获取所有 webhook 时,您是否能够看到列出的 webhook?你马上试了吗?找不到 webhook 时是否重试?

(不幸的是,有时 webhooks 可能会因为各种原因而死掉,尤其是随着时间的推移,我正试图清楚地了解正在发生的事情 - 对于所有问题,我深表歉意。)

编辑

我通过我们的 api-support@asana.com 电子邮件亲自联系了您。我们会记录上次尝试联系时 return 编辑的内容;在我看来,在阅读 return 时,回调路径未配置为在尝试回调时接受 Content-Type: application/json header 和有效负载。奇怪的是握手有效,因为那里也应该是这种情况:我们在握手中发回 {} 的 json。希望这可以提供一个简单的解决方案。

我希望我们在这里继续取得进展 - 握手应该让您知道您是否可以正确捕获回调;它没有这样做的事实是最令人困惑的方面。尤其是当您尝试获取 webhook 时评论的 "right after that" 部分 - webhook 被丢弃似乎还为时过早,除非握手应该失败。我们将继续对此进行调查,希望这是我们从 webhook 中看到的对您有用的信息!

最终编辑

我进一步调查。如果我们在第一次交付尝试时收到错误,那么我们这边就有错误。目的是进行指数重试退避,但相反,我们丢弃了 webhook。

明确地说,这是错误发生的地方:

  • 请求 1 到 Asana:POST 到 app.asana.com/api/1.0/webhooks;这会阻止
    • Req2 到目标:POST 从 Asana 到你的目标
    • 来自目标的 Res2:200 OK 相同 X-Hook-Secret header
  • Asana 的 Res1:200 OK,上面列出的数据

也就是说,握手成功。

然后,一段时间后(可能很短),当资源更改时,如果这是该 webhook 的第一个资源更新回调:

  • 目标请求 3:POST 来自 Asana 的资源已更改
  • 来自目标的 Res3:4xx/5xx 失败(200 以外的任何值)

此时,Asana 的正确行为是使用退避重试。相反,我们错误地丢弃了 webhook。

我们正在努力纠正这个错误,因为它产生的行为很奇怪:握手有效,然后开发人员调整资源来测试它;然后 webhook 消失。与此同时,在接收方,我鼓励开发人员检查他们的日志,看看他们是否已经使用 HTTP 错误代码响应任何传入的 Asana 请求;这将验证 webhook 被丢弃的原因。

感谢您告知我们,对于观察到的奇怪行为,我们深表歉意!