我有一个带有 WebBrowser 控件的 WPF 应用程序。
我想拦截和跟踪浏览器控件发出的http请求。
我不想修改内容。我只想在加载的 url 匹配特定模式时执行一些规则。特别是,我有一些 ajax 调用返回填充 Web 控件的数据。
我想捕获这些数据以在容器应用程序中也起作用。可能吗?如何?
conrtol 有一个 LoadCompleted 事件,但它仅针对 Source 属性中指定的 uri 而不是 subressourceS 触发。
正如在副本中回答的那样,这是解决方案:
我已经能够解决这样的问题。
您将需要一些第 3 方组件:
正如您所猜测的那样,这个想法是创建一个内存代理服务器,并将您的 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");
}
}
您必须为此应用程序添加一些管道,以便路由和分析从应用程序到业务类的请求,但这超出了此问题的范围。