weixin_33713350 2016-07-18 11:38 采纳率: 0%
浏览 181

启动应用程序时,有没有办法以编程方式清除浏览器缓存?

由于我对用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,就会得到想要的结果,这使我得出结论,浏览器缓存可能有问题,但是我不是很确定。

另一个问题:启动应用程序时,有没有办法以编程方式清除浏览器缓存?

任何帮助都将不胜感激,谢谢!

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 19:34
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分