在WPF WebBrowser控件中管理cookie?

时间:2009-12-29 16:42:00

标签: wpf cookies httpwebrequest browser cookiecontainer

有没有办法读取/写入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 个答案:

答案 0 :(得分:7)

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

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

然而,虽然可能很自然地得出结论,托管WebBrowser的每个应用程序因此获得自己的cookie,但事实并非如此。只有两套cookie:用于“低完整性”的cookie。模式(默认情况下是IE运行的模式)和另一组,这是您在托管WebBrowser的普通应用程序中获得的内容,以及您在运行时获得的内容IE提升了。

答案 1 :(得分:6)

webbrowser控件使用WinInet进行网络连接,特别是使用InternetSetCookie(Ex)和InternetGetCookie(Ex)函数进行Cookie管理。 .Net中没有WinInet包装器,但您可以调用。

答案 2 :(得分:3)

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

我发布了complete example here

答案 3 :(得分:3)

您可以使用Application.GetCookieApplication.SetCookie方法。

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

答案 4 :(得分:0)

前几天我遇到了同样的问题。 除了前面的答案的例子,这里是WebBrowser控件的Win32包装器。此实现的优点是它公开了默认WebBrowser控制的更多选项。

不幸的是,如果它不是WPF原生的,那么如果您计划在WPF中使用它,则必须创建一个包装器。

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

答案 5 :(得分: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
            );
        }