是否可以拦截在wpf浏览器控件中收到的内容?

时间:2012-07-06 12:11:54

标签: wpf browser

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

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

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

我想捕获这些数据以便也在容器应用程序中执行操作。可能吗?怎么样?

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

1 个答案:

答案 0 :(得分:4)

正如duplicate所述,这是解决方案:

我已经能够解决这个问题了。

您需要一些第三方程序集:

  1. FiddlerCore:将作为嵌入在您的应用程序中的http代理
  2. Awesomium.net:WebBrowser控件,与chrome引擎配合使用。我选择此引擎,因为它允许仅为应用程序指定代理服务器。
  3. 您认为,这个想法是创建一个内存代理服务器,并将您的Web浏览器控件重定向到此代理。

    然后,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");
        }
    }
    

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