【问题标题】:WebBrowser control and cookies网络浏览器控制和 cookie
【发布时间】:2012-03-26 12:47:45
【问题描述】:

我的 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 页面时重复使用。

【问题讨论】:

    标签: vb.net cookies webbrowser-control


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 在我的帖子中添加了其他信息。实际代码与发布的代码有点不同,但都不适合我。当单击 GMail 页面中的“文档”链接时,我仍然得到登录页面。而且,是的,注册表项 FEATURE_BROWSER_EMULATION 已修改为关闭兼容性视图模式。
    • @sal 重读我的第三段,答案还在。另外,不要尝试读取或重置 cookie,因为我相信那是访问硬盘驱动器 cookie,而不是会话 cookie。如果您将新窗口请求重定向到第二个 wb 控件(在表单中放置一个),那么它应该可以正常工作,明白吗?记住,在 newwindow 事件中取消当前导航并从 e 获取 URL。或发件人。并使用您刚刚从新窗口事件收到的 URL 执行 .navigate 到第二个 wb 控件。 Cancel Boolean 应在 e. 中,设置为 true 以取消。告诉我。
    • 感谢您的帮助,但我的问题是我确实想在 NewWindows 事件中打开新的 IE9 实例。我不想用“e.Cancel = False”取消默认导航,我同意将打开新的 IE 窗口,并且我同意将一些 cookie 存储在我的本地驱动器中。我的问题是,在 NewWindow 事件中设置的 cookie 对浏览器没有任何影响,并且始终打开登录页面。
    • @sal 你是否意识到我所说的取消只是暂时的,你只是取消它,所以它不会在当前窗口或外部 IE9 窗口中打开?基本上,我们取消它只是为了将该导航重定向到您选择的窗口,这是您表单上的第二个 WB 控件,因此导航实际上并没有在一天结束时被取消。这有意义吗?因为如果您没有取消并进行了重定向(使用 .navigate 到第二个 WB 控件),那么它将在两个地方打开,我假设您不想要,并且没有任何目的。让我知道。
    【解决方案2】:

    尝试添加这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 2011-12-19
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多