WPF浏览器的LoadCompleted事件什么时候会触发?此事件是等待aspx页面中完成的任何ajax调用。
我有一个wpf应用程序,其中一个wpf浏览器控件放置在窗口窗体和一个网页加载使用导航方法。即使在一些ajax调用未初始化/等待时,LoadCompleted事件仍会触发。
请建议任何事件后,加载100%的网页火灾,包括所有ajax调用。
发布于 2012-07-19 11:56:32
我已经解决了这个问题。
你将需要一些第三方大会:
正如您所猜测的,这样做的目的是创建内存中的代理服务器,并将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");
}
}您必须为这个应用程序添加一些管道,以便将请求从应用程序路由和分析到业务类,但这超出了这个问题的范围。
发布于 2011-08-22 18:44:13
事件指出:
在被导航到已完成下载的文档时发生。
这意味着当下载url完成时,它将触发。这并不意味着任何引用的项都会触发事件(图像、脚本等)。
此外,除非您连接到JavaScript引擎本身(我不知道您是否可以这样做),否则在调用返回到web服务器时会收到通知,否则无法保证它是Ajax调用;调用没有标准,而且对Ajax的调用在您使用的各种库中通常是不同的。
例如,jQuery使用方法,而抄袭在内部包装调用,没有提供直接进行Ajax调用的方法。
或者,您可以直接使用XMLHttpRequest对象进行调用。
即使可以将其缩小到使用XMLHttpRequest的调用,您也不知道哪些调用是Ajax的;可以调用的URL并不表示它们是否是Ajax,也不表示返回的内容类型(纯文本、XML、JSON)。
发布于 2011-08-23 03:41:57
如果您了解.NET web模型的以下页面生命周期,您将得到更大的图片。
https://stackoverflow.com/questions/7151535
复制相似问题