使用针对WP8的HttpWebRequest,无需登录即可获取Facebook的AccessToken

时间:2013-03-21 06:03:01

标签: facebook-graph-api windows-phone-8

我正试图像这样获取accessstoken,

 string uri = "https://graph.facebook.com/oauth/access_token?client_id=" +
                       APP_ID +
                       "&redirect_uri=&client_secret=" + APP_SECRET + "&grant_type=client_credentials";
            var access_token = GetMyData(uri);
public async Task<string> GetMyData(string urlToCall)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlToCall);
            request.Method = "GET";
            HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
            using (var sr = new StreamReader(response.GetResponseStream()))
            {
                return sr.ReadToEnd();
            }
        }
        public static Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request)
        {
            var taskComplete = new TaskCompletionSource<HttpWebResponse>();
            request.BeginGetResponse(asyncResponse =>
            {
                try
                {
                    HttpWebRequest responseRequest = (HttpWebRequest)asyncResponse.AsyncState;
                    HttpWebResponse someResponse = (HttpWebResponse)responseRequest.EndGetResponse(asyncResponse);
                    taskComplete.TrySetResult(someResponse);
                }
                catch (WebException webExc)
                {
                    HttpWebResponse failedResponse = (HttpWebResponse)webExc.Response;
                    taskComplete.TrySetResult(failedResponse);
                }
            }, request);
            return taskComplete.Task;
        } 

它陷入了var taskComplete = new TaskCompletionSource();并且花费了很多时间并且也没有得到访问权限。有什么不对?

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码

来实现此目的
public void GetMyData(string urlToCall)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(urlToCall);
    request.BeginGetResponse(new AsyncCallback(ReadWebRequestCallback), request);
}

private static void ReadWebRequestCallback(IAsyncResult callbackResult)
{
    HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
    HttpWebResponse myResponse = (HttpWebResponse)myRequest.EndGetResponse(callbackResult);

    using (StreamReader httpwebStreamReader = new StreamReader(myResponse.GetResponseStream()))
    {
        // Here you get the result
        string results = httpwebStreamReader.ReadToEnd();               
    }
    myResponse.Close();
}