protected virtual void InitOutputCache(int duration,
string varyByContentEncoding,
string varyByHeader,
string varyByCustom,
OutputCacheLocation location,
string varyByParam)
{
if (duration <= 0)
// No need to do anything, cache will be ineffective anyway
return;
HttpResponse response = Response;
HttpCachePolicy cache = response.Cache;
bool set_vary = false;
HttpContext ctx = Context;
DateTime timestamp = ctx != null ? ctx.Timestamp : DateTime.Now;
switch (location) {
case OutputCacheLocation.Any:
cache.SetCacheability (HttpCacheability.Public);
cache.SetMaxAge (new TimeSpan (0, 0, duration));
cache.SetLastModified (timestamp);
set_vary = true;
break;
case OutputCacheLocation.Client:
cache.SetCacheability (HttpCacheability.Private);
cache.SetMaxAge (new TimeSpan (0, 0, duration));
cache.SetLastModified (timestamp);
break;
case OutputCacheLocation.Downstream:
cache.SetCacheability (HttpCacheability.Public);
cache.SetMaxAge (new TimeSpan (0, 0, duration));
cache.SetLastModified (timestamp);
break;
case OutputCacheLocation.Server:
cache.SetCacheability (HttpCacheability.Server);
set_vary = true;
break;
case OutputCacheLocation.None:
break;
}
if (set_vary) {
if (varyByCustom != null)
cache.SetVaryByCustom (varyByCustom);
if (varyByParam != null && varyByParam.Length > 0) {
string[] prms = varyByParam.Split (';');
foreach (string p in prms)
cache.VaryByParams [p.Trim ()] = true;
cache.VaryByParams.IgnoreParams = false;
} else {
cache.VaryByParams.IgnoreParams = true;
}
if (varyByHeader != null && varyByHeader.Length > 0) {
string[] hdrs = varyByHeader.Split (';');
foreach (string h in hdrs)
cache.VaryByHeaders [h.Trim ()] = true;
}
if (PageAdapter != null) {
if (PageAdapter.CacheVaryByParams != null) {
foreach (string p in PageAdapter.CacheVaryByParams)
cache.VaryByParams [p] = true;
}
if (PageAdapter.CacheVaryByHeaders != null) {
foreach (string h in PageAdapter.CacheVaryByHeaders)
cache.VaryByHeaders [h] = true;
}
}
}
response.IsCached = true;
cache.Duration = duration;
cache.SetExpires (timestamp.AddSeconds (duration));
}