创建Webhook以跟踪Asana任务的更改



现在,我正在尝试在Asana中设置Webhook,以向我发送我的Asana项目中特定任务的事件更新。我很新手,所以在阅读和回答时请记住这一点,谢谢。这也是我在这里的第一篇文章,所以对我来说很容易。这是我正在运行的代码。

接收到通知的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的开发人员倡导者。这很奇怪;在我看来,您正在正确地做事...

可以肯定的是,由于webooks可能很棘手,因此您正在遇到这样的握手:

  • req1 to asana:post to app.asana.com/api/1.0/webhooks;这是在封锁的同时
    • REQ2到目标:从Asana到您的目标
    • 发布
    • res2来自Target:200 OK,使用相同的X-Hook-Secret标头
  • res1 from asana:200可以使用您上面列出的数据

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

在这种情况下,除了获得错误以外的一切似乎完全正常。当您在app.asana.com/api/1.0/webhooks上获取所有Webhooks时,您是否可以看到列出的Webhook?你马上尝试了吗?找不到Webhook时,您是否重试了?

(不幸的是,有时候Webhooks可能会死亡,尤其是由于各种原因,我试图清楚地了解正在发生的事情 - 对不起。)

编辑

我通过api-support@asana.com电子邮件亲自伸出援手。我们保留了通过最后一次尝试取得联系的内容的记录;在我阅读返回时,回调路径似乎没有配置为接受Content-Type: application/json标头并在尝试回电时有效负载。奇怪的是,握手可以正常工作,因为那里也应该是这种情况:我们在握手中寄回了{}的JSON。希望这可能会带来简单的修复。

我希望我们在这里继续取得进展 - 握手应该让您知道您是否可以正确接听回调;它不这样做的事实是最令人困惑的方面。尤其是当您尝试获取Webhook时,您的评论的"关键"部分 - 除非握手应该失败,否则Webhook似乎太早了。我们将继续对此进行调查,希望这是我们在Webhook中看到的目的的有用信息!

最终编辑

我进一步研究了。如果我们在第一次交付尝试中收到错误,我们身边有一个错误。目的是要有指数重试的退缩,但是我们丢弃了webhook。

要清楚,这是错误发生的地方:

  • req1 to asana:post to app.asana.com/api/1.0/webhooks;这是在封锁的同时
    • REQ2到目标:从Asana到您的目标
    • 发布
    • RES2来自Target:200 OK,具有相同的X-Hook-Secret标头
  • res1 from asana:200可以使用您上面列出的数据

换句话说,成功的握手。

然后,当资源更改时(如果是非常第一个资源更新回调)时,有些(可能很短)

  • REQ3到Target:从Asana发帖,资源已更改
  • res3来自目标:4xx/5xx故障(200)

在这一点上,正确的行为是让Asana在退缩的情况下重试。相反,我们错误地丢弃了Webhook。

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

感谢您让我们知道,并对观察到的奇怪的行为感到抱歉!

最新更新