通用Windows 10 WebView - 如何清除/禁用缓存?

5
我在我的UWP应用中遇到了很多清除WebView缓存的问题。如果我编辑从HTML页面链接的JS文件的内容,除非我重新安装应用程序,否则无法将更改传递到我的应用程序中。静态WebView.ClearTemporaryWebDataAsync()方法似乎不起作用。我还尝试添加请求头以禁用缓存:
private void reloadPage()
{
    string url = getUrl();
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, new Uri(url));
    request.Headers.Add("Cache-Control", "no-cache, no-store, must-revalidate");
    request.Headers.Add("Pragma", "no-cache");
    myWebView.NavigateWithHttpRequestMessage(request);
}

我还尝试了以下方法,可能会影响 WebView 的缓存行为(但不确定),但仍然没有成功:
private void onWebviewLoaded(object sender, RoutedEventArgs e)
{
    Windows.Web.Http.Filters.HttpBaseProtocolFilter myFilter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
    myFilter.CacheControl.WriteBehavior = Windows.Web.Http.Filters.HttpCacheWriteBehavior.NoCache;
    myFilter.CacheControl.ReadBehavior = Windows.Web.Http.Filters.HttpCacheReadBehavior.Default;

    WebView.ClearTemporaryWebDataAsync().AsTask().Wait();
    reloadPage();
}

任何帮助都将非常感激!
编辑(14/12/15): 我发现添加请求标头(如上面的第一个代码示例中)确实有效,但前提是自应用程序安装以来一直存在。这很有意义,因为它只是说不要缓存此特定请求-它仍然可以使用旧的缓存版本。
现在这个方法可以作为临时解决方案,但更好的方法是能够利用缓存(例如,在应用程序会话期间),然后稍后清除缓存(例如,在下一次启动时)。
编辑(14/07/16):上述方法似乎行不通。 Webview中的缓存行为似乎不稳定...
在应用程序干净安装时,我可以看到CSS / JS文件的更改,而没有任何清除/禁用缓存的代码。然后在某些看似任意的点上,文件似乎已被缓存,并且我无法从缓存中清除它们。
4个回答

3

这对我最终起作用了:

await WebView.ClearTemporaryWebDataAsync();
        Windows.Web.Http.Filters.HttpBaseProtocolFilter myFilter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
        var cookieManager = myFilter.CookieManager;

        HttpCookieCollection myCookieJar = cookieManager.GetCookies(new Uri("http://www.msftncsi.com/ncsi.txt"));
        foreach (HttpCookie cookie in myCookieJar)
        {
            cookieManager.DeleteCookie(cookie);
        }

谢谢,但不幸的是我需要清除的不是cookie,而是缓存的CSS/JS文件。 - Jasongiss

1

我不知道这是否有帮助,但尝试在URL后面添加时间戳(url + "?=" + sometimestamphere)。


非常感谢,Drast。但这对我也不起作用。我认为时间戳的URL参数需要放在页面内JS文件的链接上。 - Jasongiss
1
你也可以这样做:https://dev59.com/FGgu5IYBdhLWcg3wP01m - Tamás Deme
谢谢,Tamas。不幸的是,我认为这对我也行不通——我不想改变服务器上HTML文件的源代码,影响所有人只是为了解决UWP应用程序的问题。但是,如果我在UWP应用程序中找不到解决方案,这也是一个好的备选方案。 - Jasongiss
如果您控制HTTP服务器,请在JavaScript文件响应中添加“Cache-Control:no-cache”。 - kiewic

0
刷新Web视图似乎会重新加载:
mainWebView.Refresh();

这绝对是一种hack,但您可能可以在应用程序生命周期的某个时间点插入它,以强制重新加载您的内容。也许是在“mainWebView_NavigationCompleted()”事件之后?


0

我在UWP应用程序中遇到了类似的CSS问题,无法清除缓存。我运行了ProcessMon并发现UWP应用程序正在Windows 10中缓存.css和.js文件:C:\Users\\AppData\Local\Packages\microsoft.windows.authhost.sso.p_8wekyb3d8bbwe\AC\INetCache\Q8IHZDMV。我正在使用Web身份验证代理,因此情况可能略有不同。如果类似于此的位置没有结果,您可以尝试在启动UWP应用程序时运行processmon(SysInternals套件的一部分),以查看是否可以确定UWP应用程序用于缓存这些资源的路径。一旦找到这些资源并删除它们,重新启动应用程序即可解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接