WebBrowser control and cookies



我在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

最新更新