我写了一个简单的屏幕刮刀来帮助我为希腊语课程制作词汇闪卡。它从在线词典中删除单词,并以我的闪存卡管理员可以理解的格式输出它们。
每次运行刮刀时我都不想用请求轰炸字典,所以我在第一次加载时将每个页面缓存到我的硬盘上(当然,这也使得它更快)。我之前从未做过任何缓存,所以我不确定这类事情的最佳实践是什么。这是我的解决方案:
using System;
using System.IO;
using System.Net;
using System.Web;
public class PerseusDocument
{
readonly string url;
public PerseusDocument (string url)
{
this.url = url;
... // (load the DOM with a third-party library)
}
static string cacheUrl;
static string CacheUrl {
get {
if (cacheUrl == null) {
cacheUrl = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData), "perseus");
Directory.CreateDirectory (cacheUrl);
}
return cacheUrl;
}
}
string FullCacheUrl {
get { return Path.Combine (CacheUrl, HttpUtility.UrlEncode (url)); }
}
bool IsCached {
get { return File.Exists (FullCacheUrl); }
}
string Html {
get {
if (IsCached)
return File.ReadAllText (FullCacheUrl);
WebClient client = new WebClient ();
string html = client.DownloadString (url);
using (StreamWriter file = new StreamWriter (FullCacheUrl))
file.Write (html);
return html;
}
}
}
换句话说,我只是检查缓存中是否存在与url同名的文件。如果是这样,我加载它,如果没有,我将html保存到一个新文件。以这种方式做事有什么明显的问题吗?
答案 0 :(得分:3)
您无需构建自己的缓存。您的所有请求将自动通过WinINetCache进行路由。要打开缓存,只需执行以下操作:
webClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default);
只要服务器将其页面定义为可缓存,就会自动进行缓存。