Книга: ASP.NET MVC Framework
Атрибуты ActionFilterAttribute и OutputCacheAttribute
Атрибуты ActionFilterAttribute и OutputCacheAttribute
Существует еще один способ расширения механизма ASP.NET MVC. Через атрибут ActionFilterAttribute
разработчик может задать выполнение кода по нескольким событиям, происходящим при работе механизма MVC. Вот следующие события, на которые можно реагировать с помощью определения атрибута ActionFilterAttribute
: перед выполнением действия, после выполнения действия, перед исполнением результата и после исполнения результата.
Атрибут ActionFilterAttribute
представляет собой абстрактный класс с четырьмя виртуальными методами: OnActionExecuting
, OnActionExecuted, onResultExecuting, onResultExecuted
. Реализация атрибута ложится на плечи разработчика. Обработка этих событий может быть полезна, например, для реализации механизма логов с целью вычисления времени исполнения действий. Другим вариантом использования может быть модификация HTTP-заголовков для ответа клиенту. Таким образом работает включенный в состав ASP.NET MVC атрибут OutputCacheAttribute
.
OutputCacheAttribute
предназначен для управления стандартными HTTP-заголовками, влияющими на кэширование веб-страниц браузером пользователя. Разработчикам классического ASP.NET этот механизм знаком по директиве @ OutputCache
для ASPX-страниц и ASCX-компонентов. OutputCacheAttribute
может быть определен как для класса контроллера, так и для отдельного действия. Для управления действием у OutputCacheAttribute
есть ряд параметров:
? Duration
— значение времени в секундах, на которое производится кэширование;
? Location
— значение перечисления OutputCacheLocation
, которое определяет местоположение для кэшированного содержимого: на стороне клиента или сервера. По умолчанию устанавливается значение OutputCacheLocation.Any
, это означает, что содержимое может кэшироваться в любом месте;
? Shared
— булево значение, которое определяет, может ли использоваться один экземпляр кэшированного значения для многих страниц. Используется, когда действие возвращает результат в виде не целой страницы, а в виде частичного результата;
? VaryByCustom
— любой текст для управления кэшированием. Если этот текст равен browser
, то кэширование будет производиться условно по имени браузера и его версии (major version). Если у VaryByCustom
будет указана строка, то вы обязаны переопределить метод GetVaryByCustomString
в файле Global.asax для осуществления условного кэширования;
? varyByHeader
— строка с разделенными через точку с запятой значениями HTTP-заголовков, по которым будет производиться условное кэширование;
? varyByParam
— задает условное кэширование, основанное на значениях строки запроса при GET или параметрах при POST;
? varyByContentEncodings
— указывает условие кэширования в зависимости от содержимого директивы HTTP-заголовка Accept-Encoding;
? CacheProfile
— используется для указания профиля кэширования заданного через web.config и секцию caching;
? NoStore
— принимает булево значение. Если значение равно true, то добавляет в директиву HTTP-заголовка Cache-Control параметр no-store;
? SqlDependency
— строковое значение, которое содержит набор пар строк "база данных" и "таблица", от которых зависит кэшируемое содержимое. Позволяет управлять кэшированием на основе изменений определенных таблиц в базе данных.
В качестве примера рассмотрим следующий фрагмент кода, в котором устанавливается кэширование 1800 секунд (30 минут) любого результата контроллера AdminController
вне зависимости от параметров запроса:
[OutputCache(Duration = 1800, VaryByParam = ="none")]
public class AdminController : Controller
В другом фрагменте, наоборот, с помощью атрибута OutputCacheAttribute
отключается любое кэширование результатов контроллера AdminController
:
[OutputCache(Location = OutputCacheLocation.None)]
public class AdminController : Controller
В своей работе атрибут OutputCacheAttribute
переопределяет метод OnResultExecuting
, который вызывается перед исполнением результата действия, когда результат типа ActionResult
преобразуется в ответ на запрос пользователя, например в HTML-страницу. Вы можете создать свои варианты реализации ActionFilterAttribute
, реализовав атрибут, переопределяющий ActionFilterAttribute
. Для демонстрации подобной реализации создадим атрибут, который реализует сжатие результирующих страниц с помощью GZip-сжатия, которое поддерживается всеми современными браузерами.
В листинге 4.5 представлен код атрибута GZipCompressAttribute
, который реализует механизм сжатия результата действия через GZip.
Листинг 4.5
using System;
using System.IO.Compression;
using System.Web.Mvc;
namespace MVCBookProject {
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method,
Inherited = true, AllowMultiple = false)]
public class GZipCompress : ActionFilterAttribute {
public override void OnActionExecuting(
ActionExecutingContext filterContext)
{
string acceptEncoding = filterContext.HttpContext.Request
.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
var response = filterContext.HttpContext.Response;
if (acceptEncoding.ToLower().Contains("gzip"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(
response.Filter, CompressionMode.Compress);
}
}
}
}
Обратите внимание, что атрибут GZipCompressAttribute
наследует от ActionFilterAttribute
и реализует метод OnActionExecuting
, в котором С Помощью класса GZipStream
производится сжатие. Использование нашего атрибута тривиально, например, применяем его для контроллера AdminController
так, как показано во фрагменте кода:
[GZipCompress]
public class AdminController : Controller
Реализация своего варианта ActionFilterAttribute
— это очень мощное средство для расширения механизма ASP.NET MVC. Благодаря ему, мы реализовали прозрачное и простое средство для GZip-сжатия ответов для клиента. Другим стандартным средством, которое использует ActionFilterAttribute
, является атрибут outputcacheAttribute
, который позволяет управлять кэшированием результатов действий контроллера.
- 1.3.5. Методы и атрибуты
- 2. Домены и атрибуты
- 4. Виртуальные атрибуты
- У файла и каталога есть атрибуты (например: Скрытый, Только чтение). Как ими управлять из командной строки?
- 20.2.1. Атрибуты cookie: срок хранения и область видимости
- Атрибуты и свойства
- 9.1.1.1. После fork(): общие и различные атрибуты
- 9.1.4.4. Атрибуты, наследуемые exec()
- Дополнительные атрибуты файла
- Атрибуты процесса
- Атрибуты пользователя
- Атрибуты файлов и управление каталогами