2012-07-06 49 views
0

我有一個WebBrowser控件的WPF應用程序。是否可以截獲在wpf瀏覽器控件中收到的內容?

我想攔截並跟蹤瀏覽器控件發出的http請求。

我不想修改內容。我只想在加載的網址匹配特定模式時執行一些規則。特別是,我有一些Ajax調用返回填充Web控件的數據。

我想捕獲這些數據以便在容器應用程序中執行。可能嗎?怎麼樣?

conrtol有一個LoadCompleted事件,但它只在Source屬性中被解僱,而不是在subresourceS中。

+1

[WPF webbrowser的LoadCompleted事件]的可能重複(http://stackoverflow.com/questions/7151535/wpf-webbrowsers-loadcompleted-event)。大聲笑找到自己重複): – 2012-07-06 12:15:27

回答

4

正如duplicate回答,這裏是解決方案:

我已經能夠解決這樣的問題。

你需要一些第三方組件:

  1. FiddlerCore:將作爲一個HTTP代理,內嵌在應用程序中
  2. Awesomium.net:WebBrowser控件,與鉻引擎的工作原理。我選擇這個引擎,因爲它允許爲應用程序指定一個代理服務器。

正如你所猜想的那樣,這個想法是創建一個內存代理服務器,並將您的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> 

最後,主窗口.xaml.cs:

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

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

您必須爲此應用程序添加一些管道,以便將應用程序的請求路由和分析到業務類,但這超出了此問題的範圍。

+0

可能值得一提的是,提琴手不是免費的產品。 – 2016-08-12 10:51:35

+0

Fiddler **是免費的。雖然不是開源的 – 2016-08-12 15:32:18

相關問題