在C#中使用GetResponseStream()获取'(400)错误请求'

时间:2011-08-17 17:49:16

标签: .net c#-4.0 facebook-graph-api system.net system.net.webexception

我使用以下代码向facebook graph api oauth服务器发送get请求。

public string GetAccessToken(string code)
    {
        HttpWebRequest req = (HttpWebRequest) WebRequest.Create(@"https://graph.facebook.com/oauth/access_token?client_id=249725835046216&redirect_uri=http://localhost:2794/&client_secret=APP_SECRETa&code=" + code);
        HttpWebResponse res = (HttpWebResponse)req.GetResponse();
        string response=res.GetResponseStream().ToString();
        return response;
    }

以上代码抛出以下异常:

The remote server returned an error: (400) Bad Request.

同时,如果我在浏览器中键入相同的URL,则可以正常工作。请帮忙,我哪里错了?

(P.S在URL中,我肯定用密钥替换APP_SECRET)

5 个答案:

答案 0 :(得分:2)

您的查询字符串参数应为UrlEncoded:

HttpWebRequest req = (HttpWebRequest) WebRequest.Create(@"https://graph.facebook.com/oauth/access_token?client_id=249725835046216&redirect_uri=" + UrlEncode("http://localhost:2794/") + "&client_secret=" + UrlEncode(APP_SECRET) + "&code=" + UrlEncode(code));

答案 1 :(得分:1)

您必须对网址的参数进行编码。您可以使用HttpUtility类 用于编码参数。

答案 2 :(得分:0)

很可能您需要指定用户代理以满足服务器的某些检查逻辑:

HttpWebRequest req = (HttpWebRequest) WebRequest.Create(@"https://...&code=" + code);
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";

试一试,看看它是否有帮助。

答案 3 :(得分:0)

重定向网址必须与您在获取代码时提供的网址相同。

请查看这篇文章,帮帮我! http://www.ronaldwidha.net/2011/03/24/facebook-oauth-access_token-return-http-400-error-validating-verification-code/

答案 4 :(得分:0)

这就是我发生的事情,以及如何解决这个问题:

  1. 将用户重定向到

    https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL

  2. 用户点击“允许”后,它会点击我们的重定向Uri

  3. 此时我们将获得代码,我们需要做一个服务器端 HTTP访问以下Url以与我们的oAuth交换代码 访问令牌:

    https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

  4. 现在在第3步,我继续收到Http 400回复。

    经过一些研究后,我发现我们在redirect_uri上提交的step 3除了验证请求之外没有做任何事情。因此,值需要匹配与步骤2。

    简而言之:

    redirect_uri必须与step 2step 3

    相匹配