Как удалить Cookies из windows.form?
Я работаю с элементом управления Webbrowser в приложении windows.form, написанном на С#. Я хотел бы написать метод удаления файлов cookie из элемента управления Webbrowers после того, как он посещает определенный сайт. К сожалению, я не знаю, как это сделать точно и не нашел много помощи в Интернете.
Если у кого-то есть опыт, который действительно делает это, а не просто гипотетически, потому что это может быть сложнее, чем кажется, я не знаю.
int count = webBrowser2.Document.Cookie.Length;
webBrowser2.Document.Cookie.Remove(0,count);
Я бы предположил, что что-то вроде приведенного выше кода будет работать, но я думаю, что это не так. Может ли кто-нибудь пролить свет на всю эту вещь печенья?
Ответы
Ответ 1
Если у вас включен JavaScript, вы можете просто использовать этот фрагмент кода для очистки, чтобы очистить файлы cookie для сайта, на котором в данный момент находится веб-браузер.
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
Он извлекает из этот букмарклет для очистки куки файлов.
Ответ 2
Я изменил решение отсюда:
http://mdb-blog.blogspot.ru/2013/02/c-winforms-webbrowser-clear-all-cookies.html
На самом деле вам не нужен небезопасный код. Вот класс помощников, который работает для меня:
public static class WinInetHelper
{
public static bool SupressCookiePersist()
{
// 3 = INTERNET_SUPPRESS_COOKIE_PERSIST
// 81 = INTERNET_OPTION_SUPPRESS_BEHAVIOR
return SetOption(81, 3);
}
public static bool EndBrowserSession()
{
// 42 = INTERNET_OPTION_END_BROWSER_SESSION
return SetOption(42, null);
}
static bool SetOption(int settingCode, int? option)
{
IntPtr optionPtr = IntPtr.Zero;
int size = 0;
if (option.HasValue)
{
size = sizeof (int);
optionPtr = Marshal.AllocCoTaskMem(size);
Marshal.WriteInt32(optionPtr, option.Value);
}
bool success = InternetSetOption(0, settingCode, optionPtr, size);
if (optionPtr != IntPtr.Zero) Marshal.Release(optionPtr);
return success;
}
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool InternetSetOption(
int hInternet,
int dwOption,
IntPtr lpBuffer,
int dwBufferLength
);
}
Вы вызываете SupressCookiePersist где-то в начале процесса и
EndBrowserSession для очистки файлов cookie, когда браузер закрыт, как описано здесь:
Facebook с несколькими аккаунтами
Ответ 3
Я нашел решение для удаления всех файлов cookie.
пример, найденный на URL-адресе, удаляет файлы cookie при запуске приложения (процесса).
http://mdb-blog.blogspot.com/2013/02/c-winforms-webbrowser-clear-all-cookies.html
Решение использует InternetSetOption
Функция объявляет WEBBROWSER для очистки всего содержимого.
int option = (int)3/* INTERNET_SUPPRESS_COOKIE_PERSIST*/;
int* optionPtr = &option;
bool success = InternetSetOption(0, 81/*INTERNET_OPTION_SUPPRESS_BEHAVIOR*/, new IntPtr(optionPtr), sizeof(int));
if (!success)
{
MessageBox.Show("Something went wrong !>?");
}
Обратите внимание, что очистка файлов cookie для конкретного ПРОЦЕССА выполняется только в том виде, как написано на MSDN INTERNET_OPTION_SUPPRESS_BEHAVIOR:
Опция общего назначения, которая используется для подавления поведения на общесистемной основе.
Ответ 4
Попробуйте использовать это:
System.IO.File.Delete(Environment.SpecialFolder.Cookies.ToString() + "cookiename");
Ответ 5
Вариант других предлагаемых ответов, который не требует небезопасного кода или ручного сортировки:
private static void SuppressCookiePersistence()
{
int flag = INTERNET_SUPPRESS_COOKIE_PERSIST;
if (!InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SUPPRESS_BEHAVIOR, ref flag, sizeof(int)))
{
var ex = Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
throw ex;
}
}
const int INTERNET_OPTION_SUPPRESS_BEHAVIOR = 81;
const int INTERNET_SUPPRESS_COOKIE_PERSIST = 3;
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, ref int flag, int dwBufferLength);
Ответ 6
Создает ли элемент управления веб-браузером страницы с несколькими элементами, которые вы, как разработчик, не контролируете, или просто используете элемент управления веб-браузера для просмотра пользовательских HTML-страниц, созданных в вашем приложении?
Если это первый, файлы cookie напрямую привязаны к домену, который их устанавливает, и как таковой для удаления этих куки файлов вам необходимо будет следить за каталогом файлов cookie пользователей и удалять все созданные cookie файлы, трек будет изменяться на существующие файлы cookie.
Если это позже, вы всегда можете отправить элемент управления веб-браузером на пользовательскую страницу, которая удаляет файлы cookie с использованием сценариев на стороне сервера (если они доступны в вашем приложении) или JavaScript.
Ответ 7
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
Ответ 8
Я использую этот код, и он работает без JavaScript. Он выполняет те же действия, что и JavaScript, но в VB.NET. Кроме того, навигации не требуется.
For Each cookie As String In Document.Cookie.Split(";"c)
Dim domain As String = "." + url.Host
While domain.Length > 0
Dim path As String = url.LocalPath
While path.Length > 0
Document.Cookie = cookie.Split("="c)(0).Trim & "= ;expires=Thu, 30-Oct-1980 16:00:00 GMT;path=" & path & ";domain=" & domain
path = path.Substring(0, path.Length - 1)
End While
Select Case domain.IndexOf(".")
Case 0
domain = domain.Substring(1)
Case -1
domain = ""
Case Else
domain = domain.Substring(domain.IndexOf("."))
End Select
End While
Next
Единственное реальное отличие от JavaScript заключается в том, что вместо простого cookie=value
я специально ищу поиск =
и expire cookie=
. Это важно для устаревших файлов cookie, которые не имеют значения.
Ловушки:
- Вы можете удалять только файлы cookie веб-сайта, на который вы перешли.
- Если страница перенаправляется в другой домен, удаленные файлы cookie могут быть из перенаправленного домена. Или нет, это гонка между перенаправлением и вашим кодом.
- Не обращайтесь к
Document
до ReadyState = WebBrowserReadyState.Complete
, иначе Document будет Nothing, и разыменование вызовет исключение.
- Возможно, много других, но этот код отлично работает для меня.
Firefox с View Cookies Add-On помог в отладке определенных веб-страниц.
Ответ 9
После прекрасного поиска, как уничтожить сеансы в webbrowser С#, я получаю достаточный код:
webBrowser.Navigate("javascript:void((function(){var a,b,c,e,f;f=0;a=document.cookie.split('; ');for(e=0;e<a.length&&a[e];e++){f++;for(b='.'+location.host;b;b=b.replace(/^(?:%5C.|[^%5C.]+)/,'')){for(c=location.pathname;c;c=c.replace(/.$/,'')){document.cookie=(a[e]+'; domain='+b+'; path='+c+'; expires='+new Date((new Date()).getTime()-1e11).toGMTString());}}}})())")
как говорится для Джордана Милна в этой теме выше.
В моем приложении мне нужно использовать webbrowser1.navigate( "xxx" );
здесь не работают, если вы используете свойства С#.
Надеюсь, вам понравится эта информация.
Ответ 10
управление веб-браузером на основе Internet Explorer, поэтому, когда мы удаляем файлы cookie IE, cookie веб-браузера также удаляется. поэтому в ответ this вы можете попробовать следующее:
System.Diagnostics.Process.Start("CMD.exe","/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2");