2013-12-09 52 views
1

我正在使用Facebook图形API来返回我的应用程序的用户信息。到目前为止,我只需要将电子邮件作为扩展属性,我从来没有任何问题。但是,现在我必须得到用户生日,但它不能按预期工作。我得到一个空值。Facebook图形API不返回属性user_birthday

下面是我用返回的信息

using DotNetOpenAuth.OpenId; 
using DotNetOpenAuth.OAuth2; 

namespace Contoso.Web.Mvc.Controls.Authentication.IdentityProviders 
{ 
    public class FacebookIdentityProvider : IdentityProvider 
    {  

     public override ActionResult Authenticate(Func<LoginParameters, ActionResult> CallbackFunction) 
     { 
      var authorization = fbClient.ProcessUserAuthorization(); 
      var urlHelper = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext); 

      if (authorization == null && String.IsNullOrWhiteSpace(Parameters.AccessToken)) 
      { 
       //Kick off authorization request 
       fbClient.RequestUserAuthorization(scope: new string[] { "email", "user_birthday"}); 
      } 
      else 
      { 
       if(authorization != null) 
        Parameters.AccessToken = authorization.AccessToken; 

       var request = WebRequest.Create("https://graph.facebook.com/me?access_token=" + Uri.EscapeDataString(Parameters.AccessToken)); 

       using (var response = request.GetResponse()) 
       { 
        using (var responseStream = response.GetResponseStream()) 
        { 
         var graph = FacebookGraph.Deserialize(responseStream); 
         var user = GetUser(graph); 
         var requiresExtraInformation = false; 
         DoFormAuthenticationAndCreateUserIfNeeded(user, out requiresExtraInformation); 

         if (requiresExtraInformation) 
         { 
          return RedirectToExtraInformationPage(user); 
         } 
         return CallbackFunction(Parameters);        
        } 
       } 
      } 

      return new RedirectResult(urlHelper.Action("Index")); 
     } 
    } 

    [DataContract] 
    public class FacebookGraph 
    { 
     private static DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(FacebookGraph)); 

     [DataMember(Name = "id")] 
     public long Id { get; set; } 

     [DataMember(Name = "name")] 
     public string Name { get; set; } 

     [DataMember(Name = "first_name")] 
     public string FirstName { get; set; } 

     [DataMember(Name = "last_name")] 
     public string LastName { get; set; } 

     [DataMember(Name = "email")] 
     public string Email { get; set; } 

     [DataMember(Name = "gender")] 
     public string Gender { get; set; } 

     [DataMember(Name = "user_birthday")] 
     public string UserBirthday { get; set; } 

     public static FacebookGraph Deserialize(string json) 
     { 
      if (string.IsNullOrEmpty(json)) 
      { 
       throw new ArgumentNullException("jsonStream"); 
      } 

      return Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(json))); 
     } 

     public static FacebookGraph Deserialize(Stream jsonStream) 
     { 
      if (jsonStream == null) 
      { 
       throw new ArgumentNullException("jsonStream"); 
      } 
      return (FacebookGraph)jsonSerializer.ReadObject(jsonStream); 
     } 
    } 
} 

当我反序列化的回应,我从Facebook得到我得到我所需要的只是用户生日的所有信息类的一部分(显示为空) 。我查了一下,我的Facebook个人资料确实有用户生日。

+0

您是否为您正在测试的用户共享该信息? –

回答

0

好吧,我终于找到了问题,这有点傻,但我留在这里,以防其他人绊倒在这里。

问题是,即使我请求正确的范围“user_birthday”,在图形对象的属性就被称为“生日”,因此不是这个

[DataMember(Name = "user_birthday")] 
public string UserBirthday { get; set; } 

我应该有这个

[DataMember(Name = "birthday")] 
public string UserBirthday { get; set; } 

就是这样。它正在工作!