Подтвердить что ты не робот

Как удалить Cookies из windows.form?

Я работаю с элементом управления Webbrowser в приложении windows.form, написанном на С#. Я хотел бы написать метод удаления файлов cookie из элемента управления Webbrowers после того, как он посещает определенный сайт. К сожалению, я не знаю, как это сделать точно и не нашел много помощи в Интернете.

Если у кого-то есть опыт, который действительно делает это, а не просто гипотетически, потому что это может быть сложнее, чем кажется, я не знаю.

int count = webBrowser2.Document.Cookie.Length;
webBrowser2.Document.Cookie.Remove(0,count);

Я бы предположил, что что-то вроде приведенного выше кода будет работать, но я думаю, что это не так. Может ли кто-нибудь пролить свет на всю эту вещь печенья?

4b9b3361

Ответ 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");