2013-07-27 105 views
3

我正在使用.NET 4並嘗試通過Web瀏覽器控件(WPF和/或WinForms)爲StackApps站點使用桌面身份驗證來開發用於訪問StackOverflow(https://stackapps.com/questions/4215/stackapp-nntp-bridge-for-accessing-stackexchange-forums-like-stackoverflow)的NNTP橋接器。.NET 4 WebBrowser掛起

似乎無法登錄,因爲Web瀏覽器在顯示「StackExchange Login」頁面後掛起。 我使用以下網址: https://stackexchange.com/oauth/dialog?client_id=1736&scope=no_expiry&redirect_uri=https://stackexchange.com/oauth/login_success

它的工作原理在正常的IE瀏覽器,而不是在一個WinForms或WPF窗口...有誰知道問題是什麼?

它是簡單的repoduce:

  1. 創建一個WinForms項目
  2. 的「web瀏覽器」控件添加到對話框
  3. 雙擊在Form1
  4. 添加以下代碼

    private void Form1_Load(object sender, EventArgs e) 
    { 
        webBrowser1.Navigate("https://stackexchange.com/oauth/dialog?client_id=1736&scope=no_expiry&redirect_uri=https://stackexchange.com/oauth/login_success"); 
    } 
    
  5. 啓動應用程序

  6. 通過按「使用堆棧交換登錄」帳戶符號登錄
  7. 新頁面被加載;它顯示正確,但不能輸入您的登錄名;窗口掛...

同樣的情況,如果我使用WPF的應用程序和WPF的web瀏覽器,控制......它似乎是停留在JavaScript中的循環帶...

任何提示如何解決這個問題?

或者是否有可能在WebBrowser-Control中調試JavaScript?

+0

有人能夠重現此問題嗎? –

+0

你可以試試這個 - >將'WebBrowser'控件的屬性'ScriptErrorsSuppressed'設置爲'True'。如果這不起作用,請嘗試將Internet Explorer更新爲新版本。之後,'WebBrowser'控件將使用更新版本的IE,也許它會更好。只是前兩個想法:)我希望我幫助。 編輯:這[鏈接](http://stackoverflow.com/questions/14713596/how-to-add-the-firefox-and-chrome-to-c-sharp-browser-control)和這[鏈接] (http://stackoverflow.com/questions/2141668/use-chrome-as-browser-in-c)也可以提供幫助。 – Steven

+0

我也嘗試設置scriptErrorsSuppressed屬性;它不會改變任何東西......我也有最新版本的Win7上的IE瀏覽器...... –

回答

0

Project + Properties,Debug選項卡中,勾選「啓用本地代碼調試」選項。確保你已經啓用了Microsoft Symbol服務器(工具+選項,調試,符號),我知道你是這麼做的:)

現在可以使用Debug + Break All並查看瀏覽器內部發生了什麼。重複這樣做才能獲得土地的平整。您將看到Javascript正在執行(jscript8.dll),並不斷強制佈局引擎重新計算佈局,從未完成任務。

瀏覽器一般很容易陷入無限循環的Javascript。一個普通的瀏覽器往往會在幾十秒後建立一個對話框,以允許用戶中止JS,但WebBrowser沒有這個功能。它也沒有開發工具,所以調試JS也不會是一件好事。這將很難得到解決。

您可以考慮使用OAuth 2.0 API。使用說明在this web page。究竟如何與WebBrowser整合對我來說有點模糊,我沒有一個關鍵來測試它。在Stackapps site尋找幫助。您可能不是第一個遇到此問題的SE api用戶。

+0

我已經在stackapps站點問過了:http://stackapps.com/questions/4244/desktop-login-webbrowser-hangs-net,但他們把我重定向到C#;)所以我會再次嘗試向那裏尋求幫助。似乎是這樣,桌面認證不常使用......也許不在Windows下......我也嘗試過IE兼容性-ode,但也許我使用了worng值...... –

+0

我不知道如何直接使用OAuth ...我也不知道這是否支持......據我所知,是在服務器上完成登錄,因此總是需要一個url ...如果你有任何鏈接... –

1

不幸的是,我不是JavaScript開發人員,所以我只能試着向您解釋如何調試在WebBrowser控件中執行的JavaScript。

此方法適用於Microsoft Visual Studio,我不知道Delphi是否可以提供類似的功能。

  1. 啓用腳本調試(包括的Internet Explorer其他)在Internet Explorer設置。
  2. 禁用Internet Explorer設置中的友好HTTP消息
  3. 啓用在Internet Explorer設置中顯示關於每個腳本錯誤的通知。
  4. 從Visual Studio啓動您的WebBrowser託管應用程序而不調試(即,Ctrl + F5)。
  5. 在Visual Studio中,轉至調試 - >附加到進程...並在列表中選擇您的應用程序。
  6. 擊中選擇...按鈕的權附加到:字段,然後選擇腳本代碼
  7. 點擊附加按鈕。 Visual Studio啓動腳本調試器。
  8. 在您的應用程序中,按使用Stack Exchange帳戶符號登錄導航到死鎖頁面。
  9. 轉到Visual Studio並按下調試工具欄上的暫停按鈕。

現在您可以查看腳本代碼並調查代碼本身,調用堆棧,變量值等等。您也可以設置斷點。也許你可以找到腳本掛起的地方。正如我以前說過,我不是一個Web開發人員並不能幫助你這個...

更新:

我想我可以建議你一個可行的解決方案。 我的調查顯示WebBrowser在呈現IE7模式下的內容時會掛起(即使您的系統中有IE10,什麼是默認模式)。您應該強制它切換到IE9模式。在IE9模式下,頁面呈現良好,並且不會導致腳本陷入無限循環。

您可以將您WebBrowser使用下列方法之一IE9模式:

  1. 定義全球瀏覽器仿真模式在Windows註冊表您的應用程序。

對於32位操作系統,請轉至HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

對於64位操作系統,請使用HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION

在該節點,創建一個新DWORD參數調用YourApplicationExeName.exe具有值90000x2710)。如果您希望在Visual Studio調試模式下工作,您可以爲* .vshost.exe可執行文件創建其他條目。

  • 操縱用於WebBrowser源來切換它在IE9模式。
  • 這會更復雜。您需要更改html文檔的<head>標記,並最好添加一個新的<meta>標記作爲第一個元素:<meta http-equiv="X-UA-Compatible" content="IE=9"/>。 這將導致WebBrowser在文檔呈現中切換其模式。由於在文檔呈現後您無法更改兼容模式,因此您可以使用代理作爲WebBrowser的源代碼,因此此代理將添加標題。

    我已經用第一種方法成功測試過了,第二種方法也可以。 希望有所幫助!

    +0

    謝謝,我可以試試這個,但即使我發現了一個bug,我也不知道如何解決這個問題,因爲這個腳本是StackApp/StackExchange登錄表單的一部分。 – GolezTrol

    +0

    也許你知道你在瀏覽器設置中可以改變什麼等等,所以腳本不會停留在無限循環中。 – dymanoid

    +0

    剛剛更新了我已經在我的機器上成功測試過的解決方案的答案。 – dymanoid

    2

    固定WebBrowser控件

    嘗試登錄時,我也有過WebBrowser控件移交的問題。

    雖然在IE(11)中請求令牌的作品,我發現IE本身也掛起時,我把它放在IE 7仿真模式。這向我建議,我以前嘗試使WebBrowser控件使用新版本失敗。

    我發現這篇文章,Web Browser Control Specifying the IE Version,這表明對於64位模式下的32位應用程序,您需要設置一個不同的註冊表值。

    在註冊表所以,現在,我已經添加了兩個值:

    HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 
    

    HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION 
    

    在他們兩個,我添加了一個名爲 'MyExecutable.exe'(其中一個DWORD值MyExecutable是我的可執行文件的實際名稱)。他們每個人的價值是9000,這將適用於IE9及以上。注意使用RegEdit測試時,它將默認爲十六進制而不是十進制。另外,確保它是一個DWORD值,而不是任何其他類型。

    這似乎是個伎倆。我現在可以運行應用程序,完成登錄過程,並最終重定向到我指定的url,然後我可以使用webbrowser控件的OnNavigate事件捕獲該URL。

    剩下的問題

    它並沒有真正很好地工作。我第一次被重定向到一些OpenID頁面,但至少表單沒有掛起。隨着嘗試,顯然登錄(之前成功)被記住,我得到的消息「導航到網頁被取消」與刷新頁面的鏈接。當我點擊該鏈接時,我立即重定向到請求登錄表單時指定的redirect_url。至少那部分工作,我得到一個實際的access_token和失效時間,所以現在我很高興。

    更新:經過一些測試,事實證明,以前的登錄被記住。這會導致請求uri立即指向redirect_uri。我使用OnBeforeNavigate事件來檢測這個事件,但在這種情況下它不會被觸發。我現在鏈接了NavigateComplete2事件,並且在這種情況下會觸發該事件。

    修復.NET?

    我認爲對於.NET來說,解決方案應該是相同的:在第一個密鑰中添加可執行文件(和用於Visual Studio中的調試目的的MyExecutabl.vshost.exe)。如果它是在62位Windows上運行的32位可執行文件,則可能還需要將其添加到第二個密鑰,儘管我確定該規則是否也適用於.NET。我不是每天都在做C#,我試圖讓它在Delphi中起作用,但是如果我找時間在C#中測試它,我會在這裏發佈更新。最終,如果實際的問題能夠得到解決,並且JavaScript也可以在IE7模式下工作,但至少這似乎是一個適當的解決方法。