我正在开发一个WPF应用程序,我在其中使用twitter API。要显示twitter身份验证页面,我正在使用WPF Web浏览器控件。我能够成功登录并使用twitter API。我的问题是我需要清除Web浏览器的cookie以实现注销功能。有没有办法在WPF Web浏览器中清除会话cookie?
答案 0 :(得分:5)
我昨天遇到了这个问题,终于在今天提出了一个完整的解决方案。答案提到了here,其中详细介绍了here和here。
这里的主要问题是WebBrowser
(在WPF和WinForms中)不允许您修改(删除)现有的会话cookie。这些会话cookie阻止了多用户单一设备体验的成功。
上面链接中的StackOverflow响应省略了一个重要部分,它需要使用不安全的代码块,而不是使用Marshal
服务。下面是一个完整的解决方案,可以放入您的项目中以抑制会话cookie持久性。
public static partial class NativeMethods
{
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
private const int INTERNET_OPTION_SUPPRESS_BEHAVIOR = 81;
private const int INTERNET_SUPPRESS_COOKIE_PERSIST = 3;
public static void SuppressCookiePersistence()
{
var lpBuffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)));
Marshal.StructureToPtr(INTERNET_SUPPRESS_COOKIE_PERSIST, lpBuffer, true);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SUPPRESS_BEHAVIOR, lpBuffer, sizeof(int));
Marshal.FreeCoTaskMem(lpBuffer);
}
}
答案 1 :(得分:3)
检查以下内容,
http://social.msdn.microsoft.com/Forums/en/wpf/thread/860d1b66-23c2-4a64-875b-1cac869a5e5d
private static void _DeleteSingleCookie(string name, Uri url)
{
try
{
// Calculate "one day ago"
DateTime expiration = DateTime.UtcNow - TimeSpan.FromDays(1);
// Format the cookie as seen on FB.com. Path and domain name are important factors here.
string cookie = String.Format("{0}=; expires={1}; path=/; domain=.facebook.com", name, expiration.ToString("R"));
// Set a single value from this cookie (doesnt work if you try to do all at once, for some reason)
Application.SetCookie(url, cookie);
}
catch (Exception exc)
{
Assert.Fail(exc + " seen deleting a cookie. If this is reasonable, add it to the list.");
}
}
答案 2 :(得分:0)
我没有测试过这个,但我认为最好的方法是在页面上定义一个Javascript方法(如果你能够)清除cookie。
document.cookie='c_user=;expires=Thu, 01 Jan 1970 00:00:00 GMT;domain=.facebook.com';
(或任何cookie名称)。然后,您可以在 WebBrowser 控件上使用InvokeScript方法。