在开发Windows Phone 7应用程序时,可能会遇到需要让用户使用不同凭证登录Facebook的情况。传统的方法是获取相关Facebook URL的cookies并清除它们。然而,对于WebBrowser控件,Windows Phone 7并没有提供直接的API来访问cookies。尽管如此,还是找到了一种方法来绕过这个限制。以下是如何实现的步骤:
虽然WebBrowser控件没有直接的API来获取cookies,但可以通过设置特定web请求的CookieContainer属性来访问cookies。以下是如何创建HttpWebRequest和关联的CookieContainer,并将CookieContainer传递给web请求的示例代码:
private HttpWebRequest _webRequest;
private CookieContainer _cookieContainer = new CookieContainer();
...
this._webRequest = (HttpWebRequest)HttpWebRequest.Create(uri);
this._webRequest.CookieContainer = this._cookieContainer;
在这里,创建了一个HttpWebRequest和一个关联的CookieContainer,并将这个CookieContainer传递给web请求。需要在整个应用程序的生命周期内保留这个web请求,或者至少保留最后一次用来访问Facebook的web请求(这取决于应用程序的繁忙程度以及对web请求的使用情况。成功地将应用程序代码修改为在整个应用程序生命周期内使用单个web请求)。然后可以使用CookieContainer实例来找到相关的cookies。
为了找到并清除Facebook的cookies,需要请求CookieContainer提供与特定URL匹配的cookies。发现请求https://login.facebook.com/login.php就足够了,但可能需要根据应用程序进行调整。以下是在WebClientHelper类中使用的代码,用于清除指定URL的cookies:
public void ClearCookies(Uri uri)
{
var cookies = this._cookieContainer.GetCookies(uri);
foreach(Cookie cookie in cookies)
{
cookie.Discard = true;
cookie.Expired = true;
}
}
发现将Discard和Expired属性都设置为true就足以清除cookies。也许单独设置其中一个属性就足够了,但没有机会验证这一点。
以下是调用这个方法的代码示例:
private static readonly Uri FacebookCookieUri = new Uri("https://login.facebook.com/login.php");
...
this._helper.ClearCookies(FacebookCookieUri);