简体   繁体   中英

Make HttpRequest cache work

I want to force HttpRequest response to be cached absolutely without any conditions. But it seems like sometimes it doesn't work. May be it looks at headers but I don't want it to. For an example this url is not cached sometimes. Here is a code:

public static class HttpRequestHelper
{
    public const string ContentTypeForm = "application/x-www-form-urlencoded";

    public static HttpWebRequest CreateRequest(Uri uri)
    {
        HttpWebRequest request = WebRequest.CreateHttp(uri);
        request.Proxy = null;
        return request;
    }

    public enum CacheMode
    {
        None = 0,
        Hourly,
        Max,
    }

    public static string Request(Uri uri, CacheMode cache = CacheMode.None)
    {
        HttpWebRequest request = CreateRequest(uri);
        if (cache != CacheMode.None)
            request.CachePolicy = new HttpRequestCachePolicy(HttpCacheAgeControl.MaxStale,
                cache == CacheMode.Hourly ? TimeSpan.FromHours(1) : TimeSpan.FromDays(365));
        return GetContent(request);
    }

    public static HttpWebResponse GetResponse(HttpWebRequest request)
    {
        Contract.Requires(request != null);
        Debug.WriteLine("Request: " + request.RequestUri);
        var response = request.GetResponse() as HttpWebResponse;
        return response;
    }


    public static string GetContent(WebRequest request)
    {
        Contract.Requires(request != null);
        string data = "";
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            Stream responseStream = response.GetResponseStream();
            if (responseStream == null) return data;
            using (var reader = new StreamReader(responseStream))
            {
                data = reader.ReadToEnd();
            }
        }
        return data;
    }
}

Most likely reason is server's response specifies some sort of "don't cache" headers. Ie it could be Pragma: no-cache - so item will not be cached despite your efforts.

Possible workaround is to cache results yourself in-memory or on disk...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM