Отдельные сеансы с использованием элементов управления aXWebBrowser в приложении WinForms?

Как программно управлять несколькими браузерами (управление aXWebBrowser) из одного процесса приложения winforms, ориентированного на один и тот же удаленный веб-сайт, но каждый браузер находится в своей области сеанса с удаленным сайтом?

Цели. Создать приложение, которое автоматизирует использование веб-сайта. Цель состоит в том, чтобы приложение выполняло работу до 5 пользователей, взаимодействующих с браузером на одном и том же веб-сайте.

Очевидные проблемы. Каждый экземпляр браузера делится своими «сеансовыми» данными, отправленными ему удаленным веб-сайтом. В результате различные браузеры не могут действовать так, как это сделали бы реальные пользователи. Независимо от того, сколько различных элементов управления aXWebBrowser создается, каждый из них теряет свой контекст сеанса и использует контекст сеанса, установленный последним/последним/самым последним созданным браузером. Другими словами, последний запущенный элемент управления уничтожает установленный контекст сеанса любого предшествующего ему элемента управления.

Уже пробовали — добавление одного из следующих ключей реестра в «hkcu\software\microsoft\internet explorer\main»: TabProcGrowth=DWORD:0, FrameMerging=DWORD:0, SessionMerging=DWORD:0. При запуске IE8 с моего значка на рабочем столе (вне приложения) это работает нормально, IE8 ведет себя так, как хотелось бы. Однако при запуске приложения с использованием элементов управления axWebBrowser оно работает, параметры реестра, похоже, не влияют на элементы управления axWebBrowser. Другие способы увидеть нежелательное поведение вне приложения включают в себя: щелчок «Новый сеанс» в меню «Файл» IE8 и запуск iexplore.exe с параметром -nomerge. Они не работают в приложении, поскольку элемент управления axWebBrowser использует Wininet для связи.

Ограничения. Значительный объем кода уже написан и работает с использованием элемента управления aXWebBrowser (автоматизируемый веб-браузер Internet Explorer ActiveX), поэтому идеальное решение не требует перезаписи кода с использованием нового элемента управления. - После того, как решение будет найдено, приложение отобразит окно(я) браузера для пользователя рабочей станции. - Приложение winforms (.NET 2.0) размещает элементы управления - Все браузеры ориентированы на один и тот же удаленный веб-сайт.


person Community    schedule 10.06.2009    source источник


Ответы (1)


Из того, что я смог сказать, пока каждый браузер загружается в один и тот же поток, 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; }
}
person Adam Larsen    schedule 26.08.2009
comment
Я попробовал ваш пример кода (с установленным IE8), и все элементы управления браузером фактически используют один и тот же сеанс. - person Vizu; 16.09.2010