我在WebBrowser控件和cookie方面遇到问题。
首先,当一个人在普通的Web浏览器(在我的例子中是IE9)中导航时会发生什么:
1.1.我打开网页http://www.gmail.com.
我输入用户名/密码,
我将复选框"保持登录"未选中,然后单击"Sign-in,
IE9打开我的GMail页面,其中列出了我的所有邮件。没关系。
1.2.在GMail页面的顶部有很多链接,如"日历"、"文档"等。
当我单击"文档"链接时,我的文档页面将在IE9中的一个单独选项卡中打开。不要求提供名称/psw的其他登录信息。这也很好。
现在,当我在WebBrowser控件中重复所有这些时会发生什么(我已经创建了一个非常简单的VB.NET应用程序,其中只有一个WebBrowser控件)。
2.1.在表单加载事件中,执行以下代码:
Private Sub MyForm_Load(sender As System.Object, e As System.EventArgs)
Me.MyWebBrowser.Navigate("http://www.gmail.com")
End Sub
2.2.我在WebBrowser控件中输入我的GMail登录信息(名称和psw)
2.3.当我点击"文档"链接时,IE9的一个新实例被打开,
2.4.谷歌没有显示我的文档列表,而是要求我在IE9窗口中再次登录。为什么?为什么我必须再次输入我的凭据?
我认为cookie有问题,在步骤2.2中没有正确设置。你知道哪里出了问题吗?为了正确设置cookie,必须做些什么?
提前感谢,
Sal
附加信息:
我的WebBrowser NewWindow事件功能实现为:
Private Sub MyWebBrowser_NewWindow(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles MyWebBrowser.NewWindow
Dim CookiesArr As String() = MyWebBrowser.Document.Cookie.Split(";")
For Each Cookie In CookiesArr
Dim Idx As Long = Cookie.IndexOf("=")
If Idx <> -1 Then
Dim CookieName As String = Cookie.Substring(0, Idx).Trim
Dim CookieValue As String = Cookie.Substring(Idx + 1).Trim
InternetSetCookie("http://www.google.com", Nothing, CookieName + " = " + CookieValue + "; expires = Sat,05-Jan-2013 00:00:00 GMT")
End If
Next
End Sub
我认为InternetSetCookie()方法应该将cookie永久存储在"C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\cookies"目录中,以便在打开需要授权的谷歌页面时重复使用。
这是因为web浏览器控件正在一个单独的IE9窗口中打开您的链接,对吧?如果您打开它,或者在Winforms程序的另一个web浏览器控制窗口中打开它,或在单击链接的同一窗口中打开,那么它应该可以正常工作。
他们使用会话中的cookie(内存中)来保存您的登录信息,而不是写入硬盘的类型,这就是为什么当您运行另一个进程时,信息(内存中的会话cookie)不会出现或传播到新进程。
因此,要拦截链接点击并在您选择的wb窗口中打开它,您需要拦截newwindow事件,取消导航并使用重新导航。导航到您选择的wb,如果您需要帮助,请告诉我,但网上有很多。
此外,请记住,web浏览器控件默认使用IE7,即使您安装了IE9,也可以通过注册表进行更改。
尝试添加这个:
Private Declare Function InternetSetCookie Lib "wininet.dll" Alias "InternetSetCookieA" (ByVal lpszUrlName As String, ByVal lpszCookieName As String, ByVal lpszCookieData As String) As Boolean