在WPF WebBrowser控件中管理cookies?

8
有没有一种方法可以读取/写入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);  
6个回答

7
关于WebBrowser控件和cookies,可能令人困惑的一点是,乍一看,你的应用程序似乎获得了一个单独的cookie存储器。例如,如果您登录到一个存储持久cookie以识别您的站点,那么无论您从托管控件的应用内部是否似乎已登录到该站点,都将是独立于通过Internet Explorer登录的状态。
事实上,您甚至可以使用不同的身份登录。
然而,尽管认为每个托管WebBrowser的应用程序因此获得了自己的cookie很自然,但实际上并非如此。只有两组cookie:在“低完整性”模式下使用的cookie(这是IE默认运行的模式),以及在正常托管WebBrowser的应用程序中所使用的另一组cookie,也是您在运行IE时可获得的另一组cookie。

4
未回答如何读取和编写 cookies 的问题。 - Kurren
1
@Kurren,但它确实解决了OP想要做的事情——查看源代码可以清楚地看到目标是更改(“写入”)或发现(“读取”)浏览器正在使用哪个特定的cookie集。此外,我的答案解释了WebBrowser使用与IE始终使用的相同cookie存储,这告诉您访问WebBrowser使用的cookie的方式没有什么特别之处——您可以像以往一样进行操作。既然Sheng Jiang已经展示了如何做到这一点,那么我重复他的回答就没有意义了;我的目标是提供有用的额外信息。 - Ian Griffiths

6

WebBrowser控件使用WinInet进行网络操作,特别是使用InternetSetCookie(Ex)和InternetGetCookie(Ex)函数进行Cookie管理。.Net中没有WinInet包装器,但您可以使用p-invoke。


+1,我不知道这些API... 以后可能会有用! - Thomas Levesque

3

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

我在这里发布了一个完整的示例(链接)


3

我尝试了Application.GetCookie,但是我得到的只有NO_MORE_ITEMS。当我使用Alkampfer的示例代码直接使用InternetGetCookieEx时,它可以正确返回cookie。我认为Application例程发送的参数可能不同,这使得它无法获取我的cookie。[仅会话],[仅安全],[仅HTTP]。 - Prof Von Lemongargle
是的,alkampfer的代码使用了INTERNET_COOKIE_HTTPONLY标志,而Application.GetCookie则没有。可能就是这个差别。您可以在这里查看代码:http://referencesource.microsoft.com/#PresentationCore/src/Core/CSharp/MS/Internal/AppModel/CookieHandler.cs - Simon Mourier

0

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

不幸的是,如果它不是WPF本地的,那么如果你计划在WPF中使用它,你将不得不创建一个包装器。

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


0
 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
            );
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接