创建Webhook以跟踪Asana Task的更改

时间:2016-12-23 08:23:55

标签: asana asana-api

现在我尝试在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"

有人对此错误消息有任何疑问吗? 我假设做握手和处理接收挂钩的代码在同一个地方。?

非常感谢

1 个答案:

答案 0 :(得分:0)

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

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

  • Req1 to Asana:POST app.asana.com/api/1.0/webhooks;这会阻止
    • Req2 to Target:从Asana发送到您的目标
    • 来自目标的Res2:200 OK,具有相同的X-Hook-Secret标题
  • 来自Asana的Res1:200 OK,上面列出的数据

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

在这种情况下,除了得到错误之外的一切似乎都是正常的。在app.asana.com/api/1.0/webhooks获取所有网络挂钩时,​​您是否能够看到列出的webhook?你马上尝试过吗?当你找不到webhook时你重试了吗?

(不幸的是,有时webhooks会死,特别是随着时间的推移,出于各种原因,我正在努力清楚地了解正在发生的事情 - 对所有问题感到抱歉。)

修改

我通过api-support@asana.com电子邮件亲自联系。我们会记录上次尝试联系时返回的内容;在我看来,在回调中,回调路径未配置为在尝试回调时接受Content-Type: application/json标头和有效负载。令人好奇的是,握手是有效的,因为这也应该是这样的:我们在握手中发回{}的json。希望这可能是一个简单的解决方案。

我希望我们在这里继续取得进展 - 握手应该让你知道你是否可以正确地抓住回调;它不是这样做的事实是最令人困惑的方面。当你试图获取webhook时,特别是你的评论的“正确之后”部分 - 除非握手应该失败,否则webhook似乎太早被删除了。我们将继续对此进行调查,希望这是我们在为您结束时看到的有用信息!

最终编辑

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

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

  • Req1 to Asana:POST app.asana.com/api/1.0/webhooks;这会阻止
    • Req2 to Target:从Asana发送到您的目标
    • 来自目标的Res2:200 OK,具有相同的X-Hook-Secret标题
  • 来自Asana的Res1:200 OK,上面列出的数据

换句话说,握手成功。

然后,有些(可能很短)时间,当资源发生变化时,如果这是该webhook的第一个资源更新回调:

  • Req3 to Target:来自Asana的POST资源已更改
  • 来自Target的Res3:4xx / 5xx失败(200以外的任何其他)

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

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

感谢您告诉我们,并对观察到的奇怪行为感到抱歉!