由于我对用C#编程(并在WPF中创建应用程序)相当陌生,所以我想寻求您的帮助。
我们已经实现了我们称为“JobCacheUpdater”的东西。在不钻研太多细节的情况下,我们的基本想法如下:
- 1、我们的数据库包含数千个具有不同信息位的项目。
- 2、然后,我们希望异步地在我们的网站上加载这些信息(Ajax)。
- 3、但是,我们不需要将这些信息单独地拼凑在一起,而是要将HTML-字符串呈现到数据库中的一个单独的表中。
- 4、然后,我们根据一个ProjectID从该表中选择一行,该HTML-String基本上显示了包含项目所需信息的表。
这个“JobCacheUpdater”定期运行,这样我们就可以将带有HTML字符串的表与所有项目的主表同步起来。
到目前为止,我们已经使用Watin在后台运行浏览器、读取和呈现HTML-字符串,但我目前的任务是实现ChromiumEmbeddedFramework(CEF),而不是实现已有的功能。
在示例WPF项目中编写基本代码非常容易,但是当我使用项目的一些随机URL读取该页面的源代码并将其写入.txt文件时,我注意到它只加载了网站的“骨架”(如果我可以这样称呼它),但没有加载包含必要信息的表。
我编写了一个ChromeWrapper类,如下所示:
public class ChromeWrapper : IDisposable
{
private readonly ChromiumWebBrowser _browser;
private string _html = "";
private bool _pageIsLoaded = false;
public ChromeWrapper()
{
var settings = new CefSettings();
settings.CefCommandLineArgs.Add("disable-gpu", "1");
Cef.Initialize(settings, shutdownOnProcessExit: true, performDependencyCheck: true);
_browser = new ChromiumWebBrowser(string.Empty);
_browser.BrowserSettings.ApplicationCache = CefState.Disabled;
}
public string GetHtml(string url)
{
_pageIsLoaded = false;
while (!_browser.IsBrowserInitialized)
Thread.Sleep(100);
_browser.Load(url);
_browser.LoadingStateChanged += BrowserLoadingStateChanged;
while (!_pageIsLoaded)
Thread.Sleep(100);
return _html;
}
private void BrowserLoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
// Check to see if loading is complete - this event is called twice, one when loading starts
// second time when it's finished
// (rather than an iframe within the main frame).
if (e.IsLoading)
return;
_browser.LoadingStateChanged -= BrowserLoadingStateChanged;
var htmlTask = e.Browser.MainFrame.GetSourceAsync();
htmlTask.ContinueWith(obj =>
{
_html = htmlTask.Result;
_pageIsLoaded = true;
});
}
public void Dispose()
{
if (_browser != null)
_browser.Dispose();
Cef.Shutdown();
}
}
单击Button1后,我的MainWindows类实例化ChromeWrapper,然后将源保存到我的桌面上的.txt文件中:
private void Button1Click(object sender, RoutedEventArgs e)
{
using (var chrome = new ChromeWrapper())
{
var html = chrome.GetHtml(@"URL Test");
var htmltPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "CefSharpTest2.html");
File.WriteAllText(htmltPath, html);
Process.Start(htmltPath);
chrome.Dispose();
}
}
有趣的是,如果我在Button1Click中两次启动chrome.GetHtml,就会得到想要的结果,这使我得出结论,浏览器缓存可能有问题,但是我不是很确定。
另一个问题:启动应用程序时,有没有办法以编程方式清除浏览器缓存?
任何帮助都将不胜感激,谢谢!