3

私は.NET 4を使用しており、Webブラウザーコントロール(WPFおよび/またはWinForms)を介してStackAppsサイトのデスクトップ認証を使用して、StackOverflowにアクセスするためのNNTPブリッジを開発しようとしています(https://stackapps.com/questions/4215 /stackapp-nntp-bridge-for-accessing-stackexchange-forums-like-stackoverflow )。

「StackExchange Login」のページが表示された後、Webブラウザがハングアップするため、ログインできないようです。次の URL を使用します: https://stackexchange.com/oauth/dialog?client_id=1736&scope=no_expiry&redirect_uri=https://stackexchange.com/oauth/login_success

通常の IE ブラウザーでは機能しますが、WinForms または WPF ウィンドウでは機能しません... だれかが問題を知っていますか?

再現するのは簡単です:

  1. WinForms プロジェクトを作成する
  2. ダイアログに「WebBrowser」コントロールを追加します
  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. 「Stack Exchange でログイン」アカウント シンボルを押してログインします。
  7. 新しいページが読み込まれます。正しく表示されますが、ログイン名を入力できません。ウィンドウがハングします...

WPF-App と WPF-WebBrowser-Control を使用すると、同じことが起こります... JavaScript で無限ループに陥っているようです...

この問題を解決する方法についてのヒントはありますか?

または、WebBrowser-Control で JavaScript をデバッグすることは可能ですか?

4

3 に答える 3

2

WebBrowser コントロールの修正

ログインしようとすると、WebBrowser コントロールの処理の問題も発生しました。

IE (11) でのトークンの要求は機能しますが、IE 7 エミュレーション モードにすると、IE 自体もハングすることがわかりました。これは、以前に WebBrowser コントロールに新しいバージョンを使用させようとした試みが失敗したことを示唆しています。

Web Browser Control Specifying the IE Version という記事を見つけました。これは、64 ビット モードの 32 ビット アプリケーションの場合、別のレジストリ値を設定する必要があることを示唆しています。

そこで、レジストリに 2 つの値を追加しました。

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 を使用してこれをテストする場合は注意してください。デフォルトでは 10 進数ではなく 16 進数になります。また、他のタイプではなく、DWORD 値であることを確認してください。

これはトリックを行うようです。アプリケーションを実行し、ログイン プロセスを実行すると、最終的に指定した URL にリダイレクトされます。この URL は、Web ブラウザー コントロールの OnNavigate イベントを使用してキャプチャできます。

残りの問題

それは本当に完璧には機能しません。初めて OpenID ページにリダイレクトされましたが、少なくともフォームはハングしませんでした。その後の試行で、ログイン (以前に成功した) が記憶されているようで、 「Web ページへのナビゲーションがキャンセルされました」というメッセージと、ページを更新するためのリンクが表示されます。そのリンクをクリックすると、ログイン フォームを要求したときに指定した redirect_url にすぐにリダイレクトされます。少なくともその部分は機能し、実際の access_token と有効期限を取得できるので、今のところ満足しています。

更新:いくつかのテストの後、以前のログインが記憶されていることが判明しました。これにより、リクエスト uri がすぐに redirect_uri に転送されます。これを検出するために OnBeforeNavigate イベントを使用しましたが、この場合は発生しません。今、NavigateComplete2 イベントをリンクしました。このシナリオでは、そのイベントがトリガーされます。

.NET を修正しますか?

.NET の場合、解決策は同じであると思います。最初のキーに実行可能ファイル (および Visual Studio でのデバッグ用に MyExecutabl.vshost.exe も) を追加します。62 ビット Windows で実行されている 32 ビット実行可能ファイルの場合は、それを 2 番目のキーに追加する必要があるかもしれませんが、そのルールが .NET にも適用されるかどうかは確かです。私は日常的に C# を使用するわけではありません。最初に Delphi で動作するようにしようとしていますが、C# でこれをテストする時間があれば、ここに更新を投稿します。

最終的に、実際の問題が解決され、JavaScript が IE7 モードでも動作するようになるとよいのですが、少なくともこれは適切な回避策のようです。

于 2014-12-20T23:02:24.813 に答える
1
于 2014-12-20T20:14:33.007 に答える
0

プロジェクト + プロパティ、[デバッグ] タブで、[ネイティブ コードのデバッグを有効にする] オプションにチェックを入れます。Microsoft Symbol サーバーが有効になっていることを確認してください (ツール + オプション、デバッグ、シンボル)。

Debug + Break All を使用して、ブラウザー内で何が起こっているかを確認できるようになりました。これを繰り返して土地の状況を把握します。Javascript が実行され (jscript8.dll)、常にレイアウト エンジンにレイアウトの再計算を強制していることがわかります。

一般に、ブラウザーは無限ループに陥る Javascript に対して脆弱です。通常のブラウザは、ユーザーが JS を中止できるように数十秒後にダイアログを表示する傾向がありますが、WebBrowser にはその機能がありません。また、開発ツールがないため、JS のデバッグも大きな喜びにはなりません。これを修正するのは難しいでしょう。

代わりに OAuth 2.0 API の使用を検討してください。使用上の注意は、この Web ページにあります。それを WebBrowser と統合する正確な方法は、私には少しわかりにくいです。これをテストするための鍵がありません。これについては、 Stackapps サイトでヘルプを見つけてください。この問題に遭遇した SE api ユーザーは、おそらくあなたが初めてではないでしょう。

于 2013-07-27T13:28:49.497 に答える