Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

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);
}
}
}
}