为facebook请求Access_Token时出现400错误请求错误

时间:2011-04-02 16:13:10

标签: asp.net facebook facebook-graph-api webrequest

我在从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;
    }

}

哪里出错了?我真的坚持这个。

感谢您阅读!

1 个答案:

答案 0 :(得分:4)

昨天我遇到了同样的问题。我使用WebClient而不是WebRequest修复了它。我认为Http error出现了,因为响应是使用 gzip encode ,因为我在 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();

                    ...