Это плохой способ кэширования страниц для моего скребка экрана? - PullRequest
1 голос
/ 30 января 2011

Я написал простой скребок для экрана, чтобы помочь мне сделать словарные флеш-карты для моего урока греческого языка.Он извлекает слова из онлайн-словаря и выводит их в формате, понятном моему менеджеру флеш-карт.

Я не хочу засыпать словарь запросами при каждом запуске скребка, поэтому я кешируюкаждая страница моего жесткого диска при первой загрузке (конечно, это также делает это намного быстрее).Я никогда раньше не занимался кешированием, поэтому я не уверен, что такое лучшие практики для такого рода вещей.Вот мое решение:

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 Ответ

3 голосов
/ 30 января 2011

Вам не нужно создавать свой собственный кеш. Все ваши запросы будут автоматически направлены через WinINetCache. Чтобы включить кеш, просто сделайте:

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

Пока сервер определил свои страницы как кэшируемые, кэширование будет происходить автоматически.

...