在 WPF WebBrowser 控件中管理 cookie?

Posted

技术标签:

【中文标题】在 WPF WebBrowser 控件中管理 cookie?【英文标题】:Managing cookies in a WPF WebBrowser control? 【发布时间】:2010-12-30 20:10:45 【问题描述】:

有没有办法读取/写入 WebBrowser 控件使用的 cookie?

我正在做这样的事情......

string resulthtml;
HttpWebRequest request = CreateMyHttpWebRequest(); // fills http headers and stuff
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))

    resultHtml = sr.ReadToEnd();

WebBrowser browser = new WebBrowser();
browser.CookieContainer = request.CookieContainer; // i wish i could do this :(
browser.NavigateToString(resultHtml);  

【问题讨论】:

【参考方案1】:

webbrowser控件使用WinInet进行联网,具体使用InternetSetCookie(Ex)和InternetGetCookie(Ex)函数进行Cookie管理。 .Net 中没有 WinInet 包装器,但您可以 p-invoke。

【讨论】:

+1,我不知道这些 API……总有一天会证明有用的!【参考方案2】:

是的,你是对的,InternetGetCookieEx 是检索 HttpOnly cookie 的唯一方法,它是从 WebBrowser 控件中获取 cookie 的首选方法。

我发了complete example here

【讨论】:

【参考方案3】:

几天前我遇到了同样的问题。 除了前面答案的示例之外,这里是 WebBrowser 控件的 Win32 包装器。这种实现的优点是它提供了比默认 WebBrowser 控件更多的选项。

很遗憾,如果它不是 WPF 原生的,因此如果您打算在 WPF 中使用它,则必须创建一个包装器。

http://code.google.com/p/csexwb2/

【讨论】:

【参考方案4】:

关于WebBrowser 控件和 cookie 的一个可能令人困惑的事情是,乍一看,它通常 看起来 像您的应用程序有一个单独的 cookie 存储。例如,如果您登录的站点存储了一个持久性 cookie 以识别您的身份,那么您是否似乎是从托管该控件的应用程序内部登录该站点将与您是否似乎通过 Internet Explorer 登录无关.

实际上,您甚至可以使用不同的身份登录。

但是,尽管很自然地得出结论,即每个托管 WebBrowser 的应用程序都会因此获​​得自己的 cookie,但实际上并非如此。只有两组 cookie:一组在“低完整性”模式下使用(这是 IE 默认运行的),另一组是在托管 WebBrowser 的普通应用程序中获得的。以及如果你运行 IE 提升,你会得到什么。

【讨论】:

不回答如何读写cookies的问题。 @Kurren 但它确实解决了操作试图做的事情 - 查看源代码,很明显目标是更改('写入')或发现('读取')哪个浏览器使用的特定 cookie 集。此外,我的回答解释说,WebBrowser 使用 IE 始终使用的相同 cookie 存储,这告诉您如何访问 WebBrowser 使用的 cookie 并没有什么特别之处 - 您可以按照您一贯的方式进行操作。既然盛江已经说明了怎么做,我就没有必要再重复了;我的目标是提供有用的附加信息。【参考方案5】:

您可以使用Application.GetCookie 和Application.SetCookie 方法。

尽管 Application 或多或少与 WPF 相关,但您可以在任何桌面 .NET 代码中使用这些方法。事实上,它们是 InternetGetCookieEx 和 InternetSetCookieEx Windows API 的包装器。

【讨论】:

我尝试了 Application.GetCookie,但我得到的只是 NO_MORE_ITEMS。当我使用来自 Alkampfer 的直接使用 InternetGetCookieEx 的示例代码时,它会正确返回 cookie。我认为应用程序例程必须发送不同的参数来阻止它获取我的cookie。 [仅限会话]、[仅限安全]、[仅限 Http]。 是的,alkampfer 的代码使用了 INTERNET_COOKIE_HTTPONLY 标志,而 Application.GetCookie 没有。这可能就是区别。你可以在这里看到代码:referencesource.microsoft.com/#PresentationCore/src/Core/CSharp/…【参考方案6】:
 Here is sample from [link][1]
 >   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;
            
    
            [System.Runtime.InteropServices.DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
            private static extern bool InternetSetOption(
            int hInternet,
            int dwOption,
            IntPtr lpBuffer,
            int dwBufferLength
            );
        

【讨论】:

以上是关于在 WPF WebBrowser 控件中管理 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

wpf中我想在WebBrowser控件上放置一个Border控件

WPF 使用Win32API 让控件置于WebBrowser上方

在 C# Webbrowser 控件 WPF 中从 Javascript 获取返回值

WPF 使用Win32API 让控件置于WebBrowser上方

如何禁用 WPF WebBrowser 控件的点击噪音?

在多个窗口中使用 WPF WebBrowser 控件时发生内存泄漏