0

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

有人对此错误消息有任何线索吗?我假设进行握手和处理接收到的钩子的代码在同一个地方。?

非常感谢

4

1 回答 1

0

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

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

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

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

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

(不幸的是,由于各种原因,webhook 有时会死掉,尤其是随着时间的推移,我正试图清楚地了解正在发生的事情 - 抱歉所有问题。)

编辑

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

我希望我们在这里不断取得进展——握手应该让你知道你是否能正确地捕捉到回调;它没有这样做的事实是最令人困惑的方面。尤其是当您尝试获取 webhook 时,您的评论中的“紧接着”部分 - 除非握手应该失败,否则 webhook 被丢弃似乎为时过早。我们将继续对此进行调查,并希望这是我们在 webhook 中看到的有用信息,供您参考!

最终编辑

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

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

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

换句话说,一次成功的握手。

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

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

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

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

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

于 2016-12-30T00:32:22.540 回答