为什么我的web api Post控制器没有收到facebook webhook leadgen信息?

时间:2016-03-30 14:57:28

标签: c# facebook asp.net-web-api2 webhooks

我是新来的! Webhooks正在崛起,在工作中我们正在产生潜在客户。我有一个' GET' web api 2中的控制器,这将验证我的应用程序,实际上我确实获得了hub.verify_token,hub.challenge和hub.mode的值。 GET控制器:

public HttpResponseMessage Get([FromUri]Hub hub){}

请注意:我使用的是C#和web api 2

现在,我的问题是facebook甚至没有打我的帖子。当我检查Azure存储资源管理器中的WADLogsTable时,有关于我记录的获取请求的信息。然而,即使post控制器有Trace.TraceError(),也没有关于POST的错误。因此POST没有被击中。我觉得我的数据结构是错误的。这是我的帖子控制器,与facebook文档一致:" https://developers.facebook.com/docs/graph-api/webhooks" (接收更新),我按如下方式构建了我的代码:

  1. POST控制器:

    public HttpResponseMessage Post([FromBody]Entry[] entry){...}
    
  2. 入门级:

    public class Entry
    {
        public string id { get; set; }
        public string[] changed_fields { get; set; }
        public Change[] changes { get; set; }
        public DateTime time { get; set; }
    }
    
  3. 更改课程

    public class Change
    {
        public string field { get; set; }
        public LeadInfo value { get; set; }
    }
    
  4. LeadInfo类

    public class LeadInfo
    {
        public string ad_id { get; set; }
        public string adgroup_id { get; set; }
        public DateTime created_time { get; set; }
        public string form_id { get; set; }
        public string leadgen_id { get; set; }
        public string page_id { get; set; }
    
    }
    
  5. 请注意,公共道具是小写的,因此它们与Facebook发送的变量名称相匹配。

    我的数据结构是否正确?

    非常感谢任何帮助。谢谢大家。

2 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。 Facebook将POST请求正文中的数据作为application / json发送,而不是HTML表单中通常的urlencoded。因此,必须读取和反序列化原始内容。

答案 1 :(得分:0)

将此用于您的模型。我通过访问此页面找到了json响应,以便从表单中获得测试结果。

https://developers.facebook.com/tools/lead-ads-testing

using Newtonsoft.Json;

public class WebHookResponseModel
{
    public Entry[] entry { get; set; }

    [JsonProperty("object")]
    public string _object { get; set; }
}

public class Entry
{
    public Change[] changes { get; set; }
    public string id { get; set; }
    public int time { get; set; }
}

public class Change
{
    public string field { get; set; }
    public Value value { get; set; }
}

public class Value
{
    public int ad_id { get; set; }
    public long form_id { get; set; }
    public long leadgen_id { get; set; }
    public int created_time { get; set; }
    public long page_id { get; set; }
    public int adgroup_id { get; set; }
}