Facebook 注销 Windows Phone 应用程序而不打开 WebBrowser
Posted
技术标签:
【中文标题】Facebook 注销 Windows Phone 应用程序而不打开 WebBrowser【英文标题】:Facebook logout Windows Phone Application without opening WebBrowser 【发布时间】:2013-01-11 04:18:04 【问题描述】:我正在尝试使用 Facebook 登录和注销操作开发 Windows Phone 7 应用程序。我通过打开 WebBrowser 找到了 Facebook SDK 并使用它来执行登录。用户在此浏览器中输入凭据并成功登录。此外,我设法在不使用任何 SDK 的情况下登录用户,只使用 http 请求,就像 SDK 实际所做的那样。但是,我想在不使用任何 WebBrowser 的情况下注销用户,而只需单击一个按钮。网络上有很多解决方案建议我打开网络浏览器并将其导航到某个 URL 以注销。然而,这不是我想要的。我认为应该有一种方法可以通过清除 cookie 来注销,我不完全知道该怎么做,或者您建议的任何其他方法。我的部分代码如下:
private static String appID = "";
private static String appSecret = "";
public static void login(String[] permissions)
try
permissionArray = permissions;
popup = new Popup();
popup.Height = 480;
popup.Width = 480;
popup.VerticalOffset = 100;
FacebookLoginUserControl control = new FacebookLoginUserControl();
control.facebookWebBrowser.Loaded += new RoutedEventHandler(webBrowser_Loaded);
control.facebookWebBrowser.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(webBrowser_Navigated);
popup.Child = control;
popup.IsOpen = true;
catch (Exception e)
//handle
private static void webBrowser_Loaded(Object sender, RoutedEventArgs e)
WebBrowser wb = (WebBrowser)sender;
String loginUrl = GetFacebookLoginUrl();
wb.Navigate(new Uri(loginUrl));
private static String GetFacebookLoginUrl()
String permissionString = String.Empty;
if (permissionArray.Length > 0)
permissionString = String.Join(",", permissionArray);
var uriParams = new Dictionary<string, string>()
"client_id", appID,
"response_type", "token",
"scope", permissionString,
"redirect_uri", "http://www.facebook.com/connect/login_success.html",
"display", "touch"
;
StringBuilder urlBuilder = new StringBuilder();
foreach (var current in uriParams)
if (urlBuilder.Length > 0)
urlBuilder.Append("&");
var encoded = HttpUtility.UrlEncode(current.Value);
urlBuilder.AppendFormat("0=1", current.Key, encoded);
var loginUrl = "http://www.facebook.com/dialog/oauth?" + urlBuilder.ToString();
return loginUrl;
private static void webBrowser_Navigated(Object sender, System.Windows.Navigation.NavigationEventArgs e)
if (string.IsNullOrEmpty(e.Uri.Fragment)) return;
if (e.Uri.AbsoluteUri.Replace(e.Uri.Fragment, "") == "http://www.facebook.com/connect/login_success.html")
string text = HttpUtility.HtmlDecode(e.Uri.Fragment).TrimStart('#');
var pairs = text.Split('&');
foreach (var pair in pairs)
var kvp = pair.Split('=');
if (kvp.Length == 2)
if (kvp[0] == "access_token")
accessToken = kvp[1];
MessageBox.Show("Access granted");
RequestUserProfile();
if (string.IsNullOrEmpty(accessToken))
MessageBox.Show("Unable to authenticate");
popup.IsOpen = false;
private static void RequestUserProfile()
var profileUrl = string.Format("https://graph.facebook.com/me?access_token=0", HttpUtility.UrlEncode(accessToken));
request = (HttpWebRequest)HttpWebRequest.Create(new Uri(profileUrl));
request.Method = "GET";
request.BeginGetResponse(result =>
try
var resp = (result.AsyncState as HttpWebRequest).EndGetResponse(result);
using (var strm = resp.GetResponseStream())
StreamReader sr = new StreamReader(strm);
var responseString = sr.ReadToEnd();
catch (Exception ex)
//
, request);
解决问题的任何想法。 提前致谢
【问题讨论】:
【参考方案1】:使用 webBrowser 到底有什么可怕的?如果您以编程方式创建 WebBrowser 对象,它将不可见,除非您将其添加到表单/页面的某个位置。如果你想清除 Facebook 的 cookie,解决方案是这样的:
// Can be invoked from your button_click event
public void TryLogout()
webBrowser = new WebBrowser();
Uri uri = new Uri("http://m.facebook.com/home.php?r", UriKind.Absolute);
webBrowser.LoadCompleted += new LoadCompletedEventHandler(webBrowser_TryLogoutLoadCompleted);
webBrowser.Navigate(uri);
然后:
private void webBrowser_TryLogoutLoadCompleted(object sender, EventArgs e)
try
var cookies = webBrowser.GetCookies();
foreach (Cookie cookie in cookies)
if (cookie.Domain.Contains("m.facebook.com"))
cookie.Discard = true;
cookie.Expired = true;
// we've just cleaned up cookies
finally
webBrowser.LoadCompleted -= webBrowser_TryLogoutLoadCompleted;
希望这会有所帮助。
GetCookies method
【讨论】:
问题是WebBrowser控件没有像Windows Phone 7中的GetCookies这样的方法。 它有。您是否添加了对 System.Net 的引用? 已添加。是的,System.Net 有关于 cookie 的方法和类,但是您上面使用的 GetCookies 方法必须属于 WebBrowser 类,该类位于“Microsoft.Phone.Controls”的命名空间中 实际上它在 Microsoft.Phone.Controls.WebBrowserExtensions 类中,但如果您添加 'Microsoft.Phone.Controls' 命名空间,它应该可以工作。让我想想…… 奇怪。我能想象到的唯一原因是您正在使用 Windows Phone 7.0 作为目标操作系统版本。如我所见,该方法适用于 OS-s:Windows Phone OS 支持:8.0、7.1。这是真的?您可以在右键单击 Project->Application->Target OS version 看到它以上是关于Facebook 注销 Windows Phone 应用程序而不打开 WebBrowser的主要内容,如果未能解决你的问题,请参考以下文章
使用 facebook c# sdk 在 windows phone 8 应用程序中没有从 facebook 获得登录响应
Windows phone 7 facebook 应用程序身份验证问题
c# Windows Phone 7 中的 Facebook 聊天客户端
Windows phone:使用 facebook graph api 获取用户的电子邮件 ID