我有一個WebBrowser控件的WPF應用程序。是否可以截獲在wpf瀏覽器控件中收到的內容?
我想攔截並跟蹤瀏覽器控件發出的http請求。
我不想修改內容。我只想在加載的網址匹配特定模式時執行一些規則。特別是,我有一些Ajax調用返回填充Web控件的數據。
我想捕獲這些數據以便在容器應用程序中執行。可能嗎?怎麼樣?
conrtol有一個LoadCompleted事件,但它只在Source屬性中被解僱,而不是在subresourceS中。
我有一個WebBrowser控件的WPF應用程序。是否可以截獲在wpf瀏覽器控件中收到的內容?
我想攔截並跟蹤瀏覽器控件發出的http請求。
我不想修改內容。我只想在加載的網址匹配特定模式時執行一些規則。特別是,我有一些Ajax調用返回填充Web控件的數據。
我想捕獲這些數據以便在容器應用程序中執行。可能嗎?怎麼樣?
conrtol有一個LoadCompleted事件,但它只在Source屬性中被解僱,而不是在subresourceS中。
正如duplicate回答,這裏是解決方案:
我已經能夠解決這樣的問題。
你需要一些第三方組件:
正如你所猜想的那樣,這個想法是創建一個內存代理服務器,並將您的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");
}
}
您必須爲此應用程序添加一些管道,以便將應用程序的請求路由和分析到業務類,但這超出了此問題的範圍。
可能值得一提的是,提琴手不是免費的產品。 – 2016-08-12 10:51:35
Fiddler **是免費的。雖然不是開源的 – 2016-08-12 15:32:18
[WPF webbrowser的LoadCompleted事件]的可能重複(http://stackoverflow.com/questions/7151535/wpf-webbrowsers-loadcompleted-event)。大聲笑找到自己重複): – 2012-07-06 12:15:27