现在我尝试在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"
有人对此错误消息有任何疑问吗? 我假设做握手和处理接收挂钩的代码在同一个地方。?
非常感谢
答案 0 :(得分:0)
我是Asana的开发者倡导者。这很奇怪;在我看来,你正确地做事......
可以肯定的是,因为webhooks可能很棘手,所以你正在经历这样的握手:
app.asana.com/api/1.0/webhooks
;这会阻止
X-Hook-Secret
标题然后你从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。
要清楚,这就是错误发生的地方:
app.asana.com/api/1.0/webhooks
;这会阻止
X-Hook-Secret
标题换句话说,握手成功。
然后,有些(可能很短)时间,当资源发生变化时,如果这是该webhook的第一个资源更新回调:
此时,正确的行为是Asana使用退避重试。相反,我们错误地废弃了webhook。
我们正在努力纠正这个错误,因为它创建的行为很奇怪:握手工作,然后测试开发人员调整资源;然后webhook消失了。在接收方面,与此同时,我鼓励开发人员检查他们的日志,看看他们是否已使用HTTP错误代码响应任何传入的Asana请求;这将验证webhook被破坏的原因。
感谢您告诉我们,并对观察到的奇怪行为感到抱歉!