0

我有一个带有 WebBrowser 控件的 WPF 应用程序。

我想拦截和跟踪浏览器控件发出的http请求。

我不想修改内容。我只想在加载的 url 匹配特定模式时执行一些规则。特别是,我有一些 ajax 调用返回填充 Web 控件的数据。

我想捕获这些数据以在容器应用程序中也起作用。可能吗?如何?

conrtol 有一个 LoadCompleted 事件,但它仅针对 Source 属性中指定的 uri 而不是 subressourceS 触发。

4

1 回答 1

4

正如在副本中回答的那样,这是解决方案:

我已经能够解决这样的问题。

您将需要一些第 3 方组件:

  1. FiddlerCore:将充当 http 代理,嵌入到您的应用程序中
  2. Awesomium.net:一个 WebBrowser 控件,与 chromium 引擎一起工作。我选择这个引擎,因为它允许为应用程序指定代理服务器。

正如您所猜测的那样,这个想法是创建一个内存代理服务器,并将您的 Web 浏览器控件重定向到该代理。

然后,FiddlerCore 发布一些事件,您可以在其中分析请求/响应,尤其是正文。

由于它充当代理,所有通信,包括 Ajax 调用、Flash 调用等,都由代理路由。

如果有帮助,一个小代码可以帮助我对这种行为进行原型设计:

应用程序.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");
    }
}

您必须为此应用程序添加一些管道,以便路由和分析从应用程序到业务类的请求,但这超出了此问题的范围。

于 2012-07-19T11:57:24.733 回答