147 lines
4.7 KiB
C#
147 lines
4.7 KiB
C#
/* ****************************************************************************
|
|
*
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
*
|
|
* This software is subject to the Microsoft Public License (Ms-PL).
|
|
* A copy of the license can be found in the license.htm file included
|
|
* in this distribution.
|
|
*
|
|
* You must not remove this notice, or any other, from this software.
|
|
*
|
|
* ***************************************************************************/
|
|
|
|
namespace System.Web.Mvc {
|
|
using System;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Web;
|
|
using System.Web.UI;
|
|
|
|
[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes",
|
|
Justification = "Unsealed so that subclassed types can set properties in the default constructor.")]
|
|
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
|
|
public class OutputCacheAttribute : ActionFilterAttribute {
|
|
|
|
private OutputCacheParameters _cacheSettings = new OutputCacheParameters();
|
|
|
|
public string CacheProfile {
|
|
get {
|
|
return _cacheSettings.CacheProfile ?? String.Empty;
|
|
}
|
|
set {
|
|
_cacheSettings.CacheProfile = value;
|
|
}
|
|
}
|
|
|
|
internal OutputCacheParameters CacheSettings {
|
|
get {
|
|
return _cacheSettings;
|
|
}
|
|
}
|
|
|
|
public int Duration {
|
|
get {
|
|
return _cacheSettings.Duration;
|
|
}
|
|
set {
|
|
_cacheSettings.Duration = value;
|
|
}
|
|
}
|
|
|
|
public OutputCacheLocation Location {
|
|
get {
|
|
return _cacheSettings.Location;
|
|
}
|
|
set {
|
|
_cacheSettings.Location = value;
|
|
}
|
|
}
|
|
|
|
public bool NoStore {
|
|
get {
|
|
return _cacheSettings.NoStore;
|
|
}
|
|
set {
|
|
_cacheSettings.NoStore = value;
|
|
}
|
|
}
|
|
|
|
public string SqlDependency {
|
|
get {
|
|
return _cacheSettings.SqlDependency ?? String.Empty;
|
|
}
|
|
set {
|
|
_cacheSettings.SqlDependency = value;
|
|
}
|
|
}
|
|
|
|
public string VaryByContentEncoding {
|
|
get {
|
|
return _cacheSettings.VaryByContentEncoding ?? String.Empty;
|
|
}
|
|
set {
|
|
_cacheSettings.VaryByContentEncoding = value;
|
|
}
|
|
}
|
|
|
|
public string VaryByCustom {
|
|
get {
|
|
return _cacheSettings.VaryByCustom ?? String.Empty;
|
|
}
|
|
set {
|
|
_cacheSettings.VaryByCustom = value;
|
|
}
|
|
}
|
|
|
|
public string VaryByHeader {
|
|
get {
|
|
return _cacheSettings.VaryByHeader ?? String.Empty;
|
|
}
|
|
set {
|
|
_cacheSettings.VaryByHeader = value;
|
|
}
|
|
}
|
|
|
|
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Param",
|
|
Justification = "Matches the @ OutputCache page directive.")]
|
|
public string VaryByParam {
|
|
get {
|
|
return _cacheSettings.VaryByParam ?? String.Empty;
|
|
}
|
|
set {
|
|
_cacheSettings.VaryByParam = value;
|
|
}
|
|
}
|
|
|
|
public override void OnResultExecuting(ResultExecutingContext filterContext) {
|
|
if (filterContext == null) {
|
|
throw new ArgumentNullException("filterContext");
|
|
}
|
|
|
|
if (filterContext.IsChildAction) {
|
|
return;
|
|
}
|
|
|
|
// we need to call ProcessRequest() since there's no other way to set the Page.Response intrinsic
|
|
OutputCachedPage page = new OutputCachedPage(_cacheSettings);
|
|
page.ProcessRequest(HttpContext.Current);
|
|
}
|
|
|
|
private sealed class OutputCachedPage : Page {
|
|
private OutputCacheParameters _cacheSettings;
|
|
|
|
public OutputCachedPage(OutputCacheParameters cacheSettings) {
|
|
// Tracing requires Page IDs to be unique.
|
|
ID = Guid.NewGuid().ToString();
|
|
_cacheSettings = cacheSettings;
|
|
}
|
|
|
|
protected override void FrameworkInitialize() {
|
|
// when you put the <%@ OutputCache %> directive on a page, the generated code calls InitOutputCache() from here
|
|
base.FrameworkInitialize();
|
|
InitOutputCache(_cacheSettings);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|