关于VB中Webbrowser Cookie的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于VB中Webbrowser Cookie的问题相关的知识,希望对你有一定的参考价值。
由于需要在同一程序内登陆两个ID,因此需要两个不同的Cookie路径,但是找了半天都找不到相关资料,谁知道如何设置webbrowser的cookie路径?
其实不需要设置路径啊,直接可以通过webbrowser控件如:
Private Sub Form_Load()
WebBrowser1.Navigate "www.baidu.com"
DoEvents
WebBrowser1.Document.cookie = "xssds"
MsgBox WebBrowser1.Document.cookie
End Sub 参考技术A WebBrowser控件和IE等一样,也是存放在Temporary Internet Files文件夹中。你可以用该控件Navigate一个网站,看看这个文件夹里多出了什么东西。
在 WPF WebBrowser 控件中管理 cookie?
【中文标题】在 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
);
【讨论】:
以上是关于关于VB中Webbrowser Cookie的问题的主要内容,如果未能解决你的问题,请参考以下文章