Как очистить данные сеанса System.Windows.Forms.WebBrowser? - PullRequest
25 голосов
/ 12 января 2009

Как очистить данные текущего сеанса (куки, кэшированные данные, сеансы аутентификации и т. Д.) Без перезапуска приложения?

Обновление: я говорю об элементе управления WebBrowser в Windows.Forms, а не о сеансе ASP.Net.

Ответы [ 8 ]

49 голосов
/ 09 декабря 2009

Чтобы очистить сеанс (например, куки HttpOnly), вы можете использовать InternetSetOption () из wininet.dll.

private const int INTERNET_OPTION_END_BROWSER_SESSION = 42;

[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);

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

InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0);
webBrowser1.Document.Window.Navigate(url);
4 голосов
/ 06 августа 2009

Если у вас включен javascript, вы можете просто использовать этот фрагмент кода, чтобы очистить файлы cookie для сайта, на котором в данный момент находится веб-браузер (я пока не нашел способа удалить файлы 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());}}}})())")

Он получен из этого букмарклета для очистки файлов cookie.

Кроме того, вы можете удалить содержимое папки «C: \ Documents and Settings \ username \ Cookies» (за исключением index.dat, который обычно заблокирован).

Что касается кэшированных данных, достаточно просто удалить все файлы в "C: \ Documents and Settings \ username \ Local Settings \ Temporary Internet Files".

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

3 голосов
/ 28 июня 2010

Я попробовал все, чтобы очистить данные формы, чтобы следующий пользователь не увидел предыдущий адрес электронной почты и т. Д. В итоге я сделал это, чтобы очистить куки ...

string[] theCookies = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Cookies));
foreach (string currentFile in theCookies)
{
   try
   {
      System.IO.File.Delete(currentFile);
   }
   catch (Exception ex)
   {
   }
}
1 голос
/ 16 ноября 2016
Private Const INTERNET_OPTION_END_BROWSER_SESSION As Integer = 42

    <DllImport("wininet.dll", SetLastError:=True)>
    Public Shared Function InternetSetOption(hInternet As IntPtr, dwOption As Integer, lpBuffer As IntPtr, lpdwBufferLength As Integer) As Boolean
    End Function

    Private Sub WebBrowserFormName_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Closed
        InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0)
    End Sub

Просто отправляю сообщение о том, кто ищет этот ответ в VB. Удачного кодирования !!!

1 голос
/ 16 апреля 2009

webBrowser1.Document.Cookies = "" не будет работать. Этот вызов не очистит куки. webBrowser1.Document.Cookies = просто работает как document.cookie в JavaScript. Вы должны найти файл cookie, который хотите очистить, например «Сессия», используйте webBrowser1.Document.Cookies = "Session = ''"; Он просто установит для куки '', как вы хотите.

0 голосов
/ 13 мая 2016

У меня сработало следующее решение -

webBrowser1.Document.ExecCommand("ClearAuthenticationCache", false, null);

Это было предложено в следующем посте для удаления куки - https://stackoverflow.com/a/21512662/6291511

Более подробную информацию вы можете найти здесь - https://msdn.microsoft.com/en-us/library/system.windows.forms.htmldocument.execcommand(v=vs.110).aspx

Надеюсь, это поможет !!!

0 голосов
/ 06 ноября 2010

Windows 7 использует файлы index.dat для хранения файлов cookie и истории, так что Билл и его друзья в CIA central могут присмотреть за вами и сделать все возможное, чтобы гарантировать, что вы не сможете удалить эти файлы и что после получения копий из-за 'Special Папки используются, и файлы .Dat остаются заблокированными во время работы Windows.

Это не идеальное решение, но оно до некоторой степени работает с полными именами файлов, содержащимися в списке.

int DeletedCount = 0;
        int CouldNotDelete = 0;
        KillExplorer();
        foreach (string DatFile in DatFiles)
        {//Do not put break point or step into the code else explorer will start and the file will become locked again
            DirectoryInfo DInfo=new DirectoryInfo(DatFile.Replace("index.dat",""));
            FileAttributes OldDirAttrib = DInfo.Attributes;
            DInfo.Attributes  = FileAttributes.Normal;//Set to normal else can not delete
            FileInfo FInfo = new FileInfo(DatFile);
            FileAttributes OldFileAttrib = FInfo.Attributes;
            SetAttr(FInfo, FileAttributes.Normal);
            TryDelete(FInfo);
            SetAttr(FInfo, OldFileAttrib);//Sets back to Hidden,system,directory,notcontentindexed
            if (File.Exists(DatFile))
                CouldNotDelete++;
            else
                DeletedCount++;

        }
        if (DatFiles.Count>0)//Lets get explorer running again
            System.Diagnostics.Process.Start(DatFiles[DatFiles.Count - 1].Replace("index.dat", ""));
        else
            System.Diagnostics.Process.Start("explorer");
        System.Windows.Forms.MessageBox.Show("Deleted " + DeletedCount + " Index.dat files with " + CouldNotDelete + " Errors");


        return "Deleted " + DeleteFileCount + " Files ";
    }

    private void KillExplorer()
    {
        foreach (Process P in Process.GetProcesses())
        {//Kill both these process because these are the ones locking the files
            if (P.ProcessName.ToLower() == "explorer")
                P.Kill();
            if (P.ProcessName.ToLower() == "iexplore")
                P.Kill();
        }
    }

    private bool TryDelete(FileInfo Info)
    {
        try
        {
            Info.Delete();
            return true;
        }
        catch 
        {return false;}
    }

    private void SetAttr(FileInfo Info,FileAttributes Attr)
    {
        try
        {
            Info.Attributes = Attr;
        }
        catch { }
    }
0 голосов
/ 05 марта 2009

Вы должны понимать, что способ отслеживания "состояния сеанса" с точки зрения веб-сервера заключается в предоставлении клиентскому браузеру файла cookie с идентификатором сеанса в нем. Когда браузер отправляет сообщение обратно на сервер, этот файл cookie позволяет серверу связать запрос с сохраненным состоянием сеанса.

Таким образом, решение состоит в том, чтобы очистить куки от элемента управления webBrowser. Например, webBrowser1.Document.Cookies = "", это должно работать, я думаю.

ASP.NET также имеет то, что он называет «сеансами без cookie», которые работают путем добавления идентификатора сеанса в URL. Так что, если это механизм, используемый сервером, вы можете попробовать отфильтровать его по URL. Но вы не увидите так много, это в основном состояние сеанса на основе файлов cookie.

...