0

Facebook Connect 認証を設定しようとしていますが、アクセス トークンを取得するのに 30 秒以上かかります。生成された URL を Web ブラウザーで参照すると、1 秒もかからずに戻ってきます。非常に時間がかかるコード行は、より高速になることを期待してusing (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))置き換えようとしましたが、そのような運はありません。トークンを取得したら、実際にユーザー データを取得する次の処理は非常に高速です。多くのWebサイトがこの認証を非常に迅速に行うのを見てきたため、これが通常の動作ではないことはわかっています. どんな提案でも大歓迎です。私が使用しているコードは次のとおりです。WebRequestWebClientWebRequest

public ActionResult FBLogin()
{
    string uri = string.Format("http://{0}{1}/Shared/FBLogin", Request.Url.Host, Request.UrlIsDefaultPort ? string.Empty : string.Format(":{0}", Request.Url.Port));

    string code = Request["Code"];
    string state = Request["State"];

    if (Request["Code"].IsNullOrEmptyTrim())
    {
        state = MD5.GetMD5String(Guid.NewGuid().ToString());

        Session["State"] = state;

        string redirectUrl = string.Format("https://www.facebook.com/dialog/oauth?client_id={0}&redirect_uri={1}&scope=email&state={2}", Settings.FacebookAppID, uri, state);

        return Redirect(redirectUrl);
    }
    else
    {
        if (state.Equals(Session["State"]))
        {
            Session["State"] = null;

            string tokenUrl = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}", Settings.FacebookAppID, uri, CryptoProvider.DecryptString(Settings.FacebookSecretKey), code);
            string token = null;

            WebRequest request = WebRequest.Create(tokenUrl);

            using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
            {
                token = ParseQueryString(sr.ReadToEnd())["access_token"];
            }

            if (token != null)
            {
                string userUrl = string.Format("https://graph.facebook.com/me?access_token={0}", token);

                request = WebRequest.Create(userUrl);

                dynamic user;

                using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
                {
                    JavaScriptSerializer serializer = new JavaScriptSerializer();
                    user = serializer.DeserializeObject(sr.ReadToEnd());
                }

                if (user != null)
                {
                    // handle login
                }
            }
        }

        return Redirect(Request.Cookies["LastURL"].Value);
    }
}

前もって感謝します。

4

1 に答える 1

0

コードが正しかったことがわかりました。それは突然、それ自体でスピードアップしました。私の推測では、Facebook で新しく作成されたアプリがサーバーを介して完全に伝播するのに数日かかるため、見つけるのに時間がかかる可能性があります。

于 2012-10-19T05:03:30.290 に答える