web-dev-qa-db-ja.com

System.Windows.Forms.WebBrowserセッションデータをクリアする方法

アプリケーションを再起動せずに現在のセッションデータ(Cookie、キャッシュデータ、認証セッションなど)をクリアするにはどうすればよいですか?

更新:ASP.Netセッションではなく、Windows.FormsのWebBrowserコントロールについて話しています。

25
user54045

セッション(HttpOnly Cookieなど)をクリアするには、wininet.dllからInternetSetOption()を使用できます。

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);
50
user227719

次のユーザーに前のメールアドレスが表示されないように、フォームデータをすべてクリアしようとしました。これを行って、Cookieをクリアしました...

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)
   {
   }
}
4
Travis

JavaScriptを有効にしている場合は、このコードスニペットを使用して、Webブラウザーが現在オンになっているサイトの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コントロールのようなものを使用した方がよいでしょう。

4
Jordan Milne
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
KleberBH

次の解決策は私のために働きました-

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

それが役に立てば幸い!!!

1
Advait Purohit

webBrowser1.Document.Cookies = ""は機能しません。この呼び出しはCookieをクリアしません。 webBrowser1.Document.Cookies = JavaScriptのdocument.cookieとして機能します。クリアしたいcookieを見つけ、sa 'Session'を使用します。webBrowser1.Document.Cookies= "Session = ''"を使用します。必要に応じて、Cookieを ''に設定します。

1
doyleconan

「セッション状態」がWebサーバーの観点から追跡される方法は、クライアントブラウザにセッションIDを含むCookieを提供することによるものであることを理解する必要があります。ブラウザーがサーバーにポストバックすると、そのCookieにより、サーバーは要求を格納されたセッション状態に関連付けることができます。

したがって、解決策は、webBrowserコントロールのCookieをクリアすることです。たとえば、webBrowser1.Document.Cookies = ""、それはうまくいくと思います。

ASP.NETには、「cookielessセッション」と呼ばれるものもあります。これは、URLにセッションIDを追加することで機能します。そのため、それがサーバーで使用されているメカニズムである場合は、URLからそれをフィルタリングしてみてください。しかし、それほど多くは表示されません。ほとんどがCookieベースのセッション状態です。

0
Ilya Tchivilev