创建 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 被丢弃的原因。
感谢您告知我们,对于观察到的奇怪行为,我们深表歉意!
现在我正在尝试在 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 被丢弃的原因。
感谢您告知我们,对于观察到的奇怪行为,我们深表歉意!