我正在尝试设置Facebook Connect身份验证,但撤回访问令牌需要30秒或更长时间。当我通过网络浏览器浏览生成的URL时,它会在不到1秒的时间内返回。花费这么长时间的代码行是using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream()))
我已经尝试用WebRequest
替换WebClient
,希望它会更快,但没有这样的运气。获得令牌后,实际提取用户数据的下一个WebRequest
非常快。我知道这不是正常行为,因为我看到很多网站很快就进行了这种身份验证。任何建议将非常感激。这是我正在使用的代码:
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);
}
}
提前致谢。
答案 0 :(得分:0)
原来代码是正确的。它突然加速了它自己。我最好的猜测是,Facebook上新创建的应用程序可能需要几天才能通过它的服务器完全传播,导致它需要一段时间才能找到。