这是为我的屏幕抓取器缓存页面的不好方法吗?

时间:2011-01-30 20:09:04

标签: c# http caching mono screen-scraping

我写了一个简单的屏幕刮刀来帮助我为希腊语课程制作词汇闪卡。它从在线词典中删除单词,并以我的闪存卡管理员可以理解的格式输出它们。

每次运行刮刀时我都不想用请求轰炸字典,所以我在第一次加载时将每个页面缓存到我的硬盘上(当然,这也使得它更快)。我之前从未做过任何缓存,所以我不确定这类事情的最佳实践是什么。这是我的解决方案:

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保存到一个新文件。以这种方式做事有什么明显的问题吗?

1 个答案:

答案 0 :(得分:3)

您无需构建自己的缓存。您的所有请求将自动通过WinINetCache进行路由。要打开缓存,只需执行以下操作:

webClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default);

只要服务器将其页面定义为可缓存,就会自动进行缓存。