2009-06-10 10 views
2

複数のブラウザ(aXWebBrowserコントロール)を単一のwinformsアプリケーションプロセスから制御して、同じリモートWebサイトをターゲットにするが、リモートサイトとの独自のセッションスコープに存在する各ブラウザをプログラミングする方法は?WinFormsアプリケーションでaXWebBrowserコントロールを使用してセッションを区切りますか?

ゴール - ウェブサイトの使用を自動化するアプリケーションを作成します。目標は、アプリケーションが同じWebサイト上のブラウザと対話する最大5人のユーザーの作業を行うことです。

表示される課題 - 各ブラウザインスタンスは、リモートWebサイトから送信された「セッション」データを共有します。その結果、さまざまなブラウザが実際の複数の人間のユーザのように行動することができなくなります。いくつの異なるaXWebBrowserコントロールがインスタンス化されても、それぞれはセッションコンテキストを失い、最後/最新/最も最近インスタンス化されたブラウザによって確立されたセッションコンテキストを共有します。つまり、最後に起動されたコントロールは、それに先行するすべてのコントロールの確立されたセッションコンテキストを破棄します。

は、すでに 試みがあります - 以下のいずれかのレジストリキーを追加する 'マイクロソフト\インターネットエクスプローラ\ HKCUの\ソフトウェア\メイン' へ:TabProcGrowth = DWORD:0、FrameMerging = DWORD:0、SessionMerging = DWORD:0。私のデスクトップのアイコン(アプリの外側)からIE8を起動すると、うまくいきます。IE8は必要に応じて動作します。ただし、axWewbBrowserコントロールを使用してアプリケーションを実行すると機能しますが、レジストリ設定はaxWebBrowserコントロールには影響しません。アプリケーションの外で拒否された動作を確認する他の方法には、IE8ファイルメニューの「新規セッション」をクリックし、-nomergeでiexplore.exeを起動する方法があります。 axWebBrowserコントロールは通信にWininetを使用するため、これらはアプリケーション内では機能しません。

制約 - すでにので、理想的なソリューションは、新しいコントロールで再書き込まれるようにコードを必要としませんaXWebBrowserコントロール(Internet ExplorerのActiveXの自動化Webブラウザ)を使用して書かれており、作業はかなりのコードがあります。 - ソリューションが見つかると、アプリケーションはブラウザウィンドウをワークステーションユーザーに表示します。 - winformsアプリケーション(.NET 2.0)がコントロールをホストしています - ブラウザーはすべて同じリモートWebサイトをターゲットにしています。

答えて

0

私は、各ブラウザが同じスレッドにロードされている限り、IEは常にそれらを同じセッションとして扱うつもりです。

セッションごとに新しいスレッドと新しいウィンドウを作成してこの問題を回避しました。

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    private static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     //// How many test windows do we need to create. 
     int numberOfClients = 5; 
     System.Threading.Thread[] threads = 
      new System.Threading.Thread[numberOfClients]; 

     //// Create threads for each of the windows, and then start them. 
     for (int i = 0; i < numberOfClients; i++) 
     { 
      threads[i] = new System.Threading.Thread(Program.StartTest); 
      threads[i].SetApartmentState(System.Threading.ApartmentState.STA); 
      //// Passing in the startup parameters for each each instance. 
      threads[i].Start(new StartupParameters(i)); 
     } 

     //// This will keep the application running until 
     //// all the windows are closed. 
     foreach (System.Threading.Thread thread in threads) 
     { 
      thread.Join(); 
     } 
    } 

    /// <summary> 
    /// Starts the test form. 
    /// </summary> 
    /// <param name="state"> 
    /// The state object containing our startup parameters. 
    /// </param> 
    private static void StartTest(object state) 
    { 
     StartupParameters parameters = state as StartupParameters; 
     YourTestForm yourTestForm = new YourTestForm(); 

     //// Set the needed parameters before we run the form. 
     //// Add your parameters here. 
     yourTestForm.Text = string.Format("Test form {0}", parameters.Index); 

     //// Run the test. 
     Application.Run(yourTestForm); 
    } 
} 

/// <summary> 
/// Contains the startup parameters used to configure 
/// each new instance of the test form. 
/// </summary> 
public class StartupParameters 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="StartupPramitures"/> class. 
    /// </summary> 
    /// <param name="index">The index.</param> 
    public StartupParameters(int index) 
    { 
     this.Index = index; 
    } 

    /// <summary> 
    /// The index for this test form. 
    /// </summary> 
    public int Index { get; private set; } 
} 
+0

サンプルコード(IE8がインストールされている)を試しましたが、すべてのブラウザコントロールが実際に同じセッションを共有しています。 – Vizu

関連する問題