WebBrowser控件和cookie

时间:2012-03-09 01:34:29

标签: vb.net cookies webbrowser-control

我遇到了WebBrowser控件和Cookie的问题。

首先,当一个人在普通的Web浏览器中导航时(在我的情况下是IE9)会发生什么:

1.1。我打开网页http://www.gmail.com

我输入我的用户名/密码,
我将复选框“保持登录取消选中,然后点击“登录”,
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。 Google没有显示我的文档列表,而是要求我再次登录IE9窗口。为什么?为什么我必须再次输入我的凭证?

我认为Cookie存在问题,并且在步骤2.2中未正确设置。您是否有任何想法有什么不对,以及必须采取哪些措施才能正确设置Cookie?

提前致谢,
萨尔

其他信息:

我的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”目录中,以便在需要授权的Google页面打开时重复使用。

2 个答案:

答案 0 :(得分:1)

这是因为Web浏览器控件在单独的IE9窗口中打开您的链接,对吗?如果您打开它或在Winforms程序中的另一个Web浏览器控制窗口中打开它,或者在您单击链接的同一窗口中打开它,那么它应该可以正常工作。

他们正在使用会话cookie(在内存中)来保存您的登录信息,而不是写入硬盘驱动器的排序,这就是为什么当您运行另一个进程时,信息(在内存会话cookie中)不存在或传播到新的过程。

因此,要截取链接点击并在您选择的某个wb窗口中打开它,您需要截取新窗口事件,取消导航并使用.navigate重新导航到您选择的wb,如果您需要帮助,请我知道,但网上有很多。

另外,请记住,Web浏览器控件默认使用IE7,即使您安装了IE9,也可以通过注册表进行更改。

答案 1 :(得分:0)

尝试添加此内容:

Private Declare Function InternetSetCookie Lib "wininet.dll" Alias "InternetSetCookieA" (ByVal lpszUrlName As String, ByVal lpszCookieName As String, ByVal lpszCookieData As String) As Boolean