2012-03-09 111 views
3

我有一個WebBrowser控件和cookie的問題。WebBrowser控件和cookies

首先,什麼時候一個在正常的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?

由於提前,
薩爾

附加信息:

我有我的web瀏覽器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在需要授權的Google頁面打開時,在「C:\ Users \ Administrator \ AppData \ Roaming \ Microsoft \ Windows \ Cookies」目錄中重新使用。

回答

1

這是因爲Web瀏覽器控件在單獨的IE9窗口中打開鏈接,對吧?如果您打開它或在Winforms程序的另一個Web瀏覽器控制窗口中打開它,或者在您點擊該鏈接的同一個窗口中打開它,那麼它應該可以正常工作。

他們正在使用會話cookie(在內存中)來保存您的登錄信息,而不是將其寫入硬盤驅動器,這就是爲什麼當您運行另一個進程時,信息(在內存會話cookie中)不存在或傳播到新的過程。因此,要攔截鏈接點擊並在您選擇的wb窗口中打開它,您需要攔截newwindow事件,取消導航並重新使用.navigate轉到您選擇的wb,如果您需要此幫助讓我知道,但網上有很多。

另外,請記住,默認情況下,網頁瀏覽器控件使用IE7,即使您安裝了IE9,也可以通過註冊表進行更改。

+0

增加了額外的信息,以我的職務。實際的代碼與發佈的代碼有點不同,但都不適用於我。在Gmail頁面點擊「文檔」鏈接時,我仍然可以獲取登錄頁面。而且,是的,修改了註冊表項FEATURE_BROWSER_EMULATION以關閉兼容性視圖模式。 – Sal 2012-03-10 22:37:58

+0

@sal重讀我的第三段,答案仍然存在。此外,不要嘗試讀取或重置cookie,因爲這是訪問硬盤cookie我相信,而不是會話cookie。如果您將新的窗口請求重定向到第二個wb控件(將其放在窗體中),那麼它應該可以正常工作,找到我?請記住,取消newwindow事件中的當前導航並從e中獲取URL。或發件人。使用剛剛從新窗口事件接收到的URL,執行導航到第二個wb控件。取消布爾應該在e。中,設置爲true來取消。讓我知道。 – 2012-03-12 17:56:23

+0

謝謝你的幫助,但我的問題是,我想要在NewWindows事件中打開新的IE9實例。我不想用「e.Cancel = False」取消默認導航,我同意新的IE窗口將打開,我同意一些cookie將被存儲在我的本地驅動器中。我的問題是,在NewWindow事件中設置的cookie不會對瀏覽器產生任何影響,並且始終打開登錄頁面。 – Sal 2012-03-15 03:52:39

0

嘗試加入這個:

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