Событие LoadCompleted веб-браузера WPF - PullRequest
3 голосов
/ 22 августа 2011

Когда сработает событие LoadCompleted веб-браузера WPF? Это событие ожидает завершения любых вызовов ajax на странице aspx.

У меня есть приложение wpf, в котором элемент управления веб-браузера размещен в форме окна, а веб-страница загружена с использованием метода Navigate. Событие LoadCompleted возникает, даже если некоторые вызовы ajax не инициализированы / ожидают.

Пожалуйста, предложите любое событие, которое запускается после 100% загрузки веб-страницы, включая все вызовы ajax.

Ответы [ 3 ]

1 голос
/ 19 июля 2012

Мне удалось решить такую ​​проблему.

Вам понадобятся сторонние сборки:

  1. FiddlerCore : будет действовать как http-прокси,встроенный в ваше приложение
  2. Awesomium.net : элемент управления WebBrowser, который работает с механизмом хрома.Я выбрал этот движок, потому что он позволяет указывать прокси-сервер только для приложения.

Идея, как вы предполагаете, состоит в том, чтобы создать прокси-сервер в памяти и перенаправить управление веб-браузером.на этот прокси.

Затем FiddlerCore публикует некоторые события, в которых вы можете проанализировать запрос / ответ, особенно тело.

Как он действует на прокси, все сообщения,включая вызовы Ajax, вызовы Flash и т. д., которые маршрутизируются прокси-сервером.

Если это может помочь, небольшой код, помогающий мне создать прототип такого поведения:

App.cs:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        BootStrap();
        base.OnStartup(e);
    }

    private void BootStrap()
    {
        SetupInternalProxy();
        SetupBrowser();
    }

    private static void SetupBrowser()
    {
        // We may be a new window in the same process.
        if (!WebCore.IsRunning)
        {
            // Setup WebCore with plugins enabled.
            WebCoreConfig config = new WebCoreConfig
            {
                ProxyServer = "http://127.0.0.1:" + FiddlerApplication.oProxy.ListenPort.ToString(),
                EnablePlugins = true,
                SaveCacheAndCookies = true
            };
            WebCore.Initialize(config);
        }
        else
        {
            throw new InvalidOperationException("WebCore should be already running");
        }
    }

    private void SetupInternalProxy()
    {
        FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete;
        FiddlerApplication.Log.OnLogString += (o, s) => Debug.WriteLine(s);

        FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default;
        //this line is important as it will avoid changing the proxy for the whole system.
        oFCSF = (oFCSF & ~FiddlerCoreStartupFlags.RegisterAsSystemProxy);

        FiddlerApplication.Startup(
            0,
            oFCSF
            );
    }

    private void FiddlerApplication_AfterSessionComplete(Session oSession)
    {
        Debug.WriteLine(oSession.GetResponseBodyAsString());
    }
}

MainWindow.xaml:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1" 
        xmlns:Custom="http://schemas.awesomium.com/winfx" 
        x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="350" Width="525" Loaded="MainWindow_Loaded">
    <Grid>

        <Custom:WebControl Name="browser"/>

    </Grid>
</Window>

И, наконец, MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        browser.LoadURL("http://google.fr");
    }
}

Вам потребуется добавить некоторые сантехники в это приложение, чтобынаправить и проанализировать запрос от приложения к бизнес-классу, но это выходит за рамки этого вопроса.

0 голосов
/ 23 августа 2011

Если вы понимаете приведенный ниже жизненный цикл веб-модели .NET, вы получите более широкую картину.

  1. Page_PreInit
  2. Элемент списка
  3. Page_Init
  4. Page_InitComplete
  5. Page_PreLoad
  6. Page_Load
  7. События управления
  8. Page_LoadComplete
  9. Page_PreRender
  10. Сохранить ViewState1022 *
  11. Page_Render
  12. Page_Unload
0 голосов
/ 22 августа 2011

Документация для события LoadComplete гласит:

Происходит после завершения загрузки документа, к которому выполняется переход.

Это означает, чточто, когда URL будет загружен, он будет запущен.Это * не означает, что какой-либо из элементов , на которые ссылаются , вызовет событие (изображения, сценарии и т. Д.).

Кроме того, если вы не подключитесь к самому механизму JavaScript (который яне в курсе, если вы можете это сделать) чтобы получать уведомления при повторном обращении к веб-серверу, нельзя гарантировать, что это Ajax-вызов;В отношении вызовов нет стандарта, и обычно вызовы для Ajax различны в разных используемых вами библиотеках.

Например, jQuery использует метод ajax() , тогда как scriptalicious внутренне оборачивает вызовы и не дает возможности сделать Ajaxпрямые вызовы.

Или вы можете совершать вызовы, используя объект XMLHttpRequest напрямую.

Даже если вы можете сузить его до вызовов, используя XMLHttpRequest, выне знал бы, какие звонки для Ajax;URL-адреса, которые могут быть вызваны, не указывают, являются ли они Ajax или нет, и тип возвращаемого содержимого (простой текст, XML, JSON).

...