有没有办法读取/写入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);
答案 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的首选方式。
答案 3 :(得分:3)
您可以使用Application.GetCookie和Application.SetCookie方法。
虽然Application或多或少与WPF相关,但您可以在任何桌面.NET代码中使用这些方法。实际上,它们是InternetGetCookieEx和InternetSetCookieEx Windows API的包装器。
答案 4 :(得分:0)
前几天我遇到了同样的问题。 除了前面的答案的例子,这里是WebBrowser控件的Win32包装器。此实现的优点是它公开了默认WebBrowser控制的更多选项。
不幸的是,如果它不是WPF原生的,那么如果您计划在WPF中使用它,则必须创建一个包装器。
答案 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
);
}