2011-04-02 93 views
1

我从facebook请求访问令牌时遇到了一些问题。首先它工作。但现在它不再工作了,我不认为我在特定的代码行中改变了一些东西。当请求访问facebook的facebook请求错误时出现错误的请求错误

下面是我如何做了它:

public static String requestAccesToken(string code) 
    { 
     //create the constructor with post type and few data 
     MyWebRequest myRequest = new MyWebRequest("https://graph.facebook.com/oauth/access_token?", "POST", "client_id=" + getAppID() + "&client_secret=" + getAppSecret() + "&code=" + code + "&redirect_uri=http://localhost:57689/search.aspx"); 

     string accessToken = myRequest.GetResponse().Split('&')[0]; 
     accessToken = accessToken.Split('=')[1]; 

     return accessToken; 
    } 
public static String getAppID() 
    { 
     return System.Configuration.ConfigurationManager.AppSettings["AppID"].ToString(); 
    } 

    public static String getAppSecret() 
    { 
     return System.Configuration.ConfigurationManager.AppSettings["AppSecret"].ToString(); 
    } 

类:MyWebrequest:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Net; 
using System.IO; 
using System.Text; 

public class MyWebRequest 
{ 
    private WebRequest request; 
    private Stream dataStream; 

    private string status; 

    public String Status 
    { 
     get 
     { 
      return status; 
     } 
     set 
     { 
      status = value; 
     } 
    } 
    /* 
    * simply download the data of the web page 
    */ 
    public MyWebRequest(string url) 
    { 
     // Create a request using a URL that can receive a post. 

     request = WebRequest.Create(url); 
    } 

    public MyWebRequest(string url, string method) 
     : this(url) 
    { 

     if (method.Equals("GET") || method.Equals("POST")) 
     { 
      // Set the Method property of the request to POST. 
      request.Method = method; 
     } 
     else 
     { 
      throw new Exception("Invalid Method Type"); 
     } 
    } 

    public MyWebRequest(string url, string method, string data) 
     : this(url, method) 
    { 

     // Create POST data and convert it to a byte array. 
     string postData = data; 
     byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

     // Set the ContentType property of the WebRequest. 
     request.ContentType = "application/x-www-form-urlencoded"; 

     // Set the ContentLength property of the WebRequest. 
     request.ContentLength = byteArray.Length; 

     // Get the request stream. 
     dataStream = request.GetRequestStream(); 

     // Write the data to the request stream. 
     dataStream.Write(byteArray, 0, byteArray.Length); 

     // Close the Stream object. 
     dataStream.Close(); 

    } 

    public string GetResponse() 
    { 
     // Get the original response. 
     WebResponse response = request.GetResponse(); //400 ERROR BAD REQUEST 

     this.Status = ((HttpWebResponse)response).StatusDescription; 

     // Get the stream containing all content returned by the requested server. 
     dataStream = response.GetResponseStream(); 

     // Open the stream using a StreamReader for easy access. 
     StreamReader reader = new StreamReader(dataStream); 

     // Read the content fully up to the end. 
     string responseFromServer = reader.ReadToEnd(); 

     // Clean up the streams. 
     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 

     return responseFromServer; 
    } 

} 

这是哪里的问题呢?我真的坚持这一个。

谢谢您的阅读!

回答

4

昨天我有同样的问题。我使用WebClient而不是WebRequest来修复它。我认为Http error并出现因为响应是使用gzip的编码,因为我是在REDIRECT_URI发送一些参数(我不知道如果是这样的原因,但现在运转):

  try 
      { 
       WebClient wc = new WebClient(); 

       wc.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip"); 

       //that solves the problem with GZIP partially: 
       wc.Proxy = null; 

       using (StreamReader reader = new StreamReader(wc.OpenRead(url))) 
       { 
        string conteudo = reader.ReadToEnd(); 

        ... 
+1

谢谢 - 经过几个小时的努力弄清楚,并让它在浏览器中工作,但没有WebClient我知道标题与它有关。 添加标题并将代理设置为null,如上面显示的那样修复了400错误。 :) – 2011-10-09 09:54:00