Главная страница   /   16.8. Использование встроенных фильтров (ASP.NET MVC 4

ASP.NET MVC 4

ASP.NET MVC 4

Адам Фриман

16.8. Использование встроенных фильтров

MVC Framework предоставляет некоторые встроенные фильтры, которые мы описали в таблице 16-9.

Таблица 16-9: Встроенные фильтры
Фильтр Описание
RequireHttps Разрешает использование протокола HTTPS для действий
OutputCache Кэширует вывод из метода действия
ValidateInput и ValidationAntiForgeryToken Фильтры авторизации, связанные с безопасностью
AsyncTimeout и NoAsyncTimeout Используются в асинхронных контроллерах
ChildActionOnlyAttribute Фильтр авторизации, который поддерживает вспомогательные методы Html.Action и Html.RenderAction

Большинство этих фильтров описаны в других частях книги. Тем не менее, два фильтра - RequireHttps и OutputCache – не относятся к чему-либо конкретно, так что мы разберем их применение здесь.

Используем фильтр RequireHttps

Фильтр RequireHttps разрешает использование протокола HTTPS для действий. Он перенаправляет браузер пользователя к тому же самому действию, но используя префикс протокола https://.

Вы можете переопределить метод HandleNonHttpsRequest и создать пользовательское поведение для обработки незащищенных запросов. Этот фильтр применяется только к запросам GET. Данные формы будут потеряны, если таким образом будет перенаправлен запрос POST.

Примечание

При использовании фильтра RequireHttps у вас могут возннуть проблемы с порядком выполнения фильтров, потому что RequireHttps - фильтр авторизации, а не фильтр действия. Информация о порядке выполнения фильтров дана в разделе «Задаем порядок выполнения фильтров» ранее в этой главе.

Используем фильтр OutputCache

Фильтр OutputCache запускает кэширование вывода от метода действия таким образом, чтобы одно и то же содержание могло быть повторно использовано для обслуживания последующих запросов к одному URL. Кэширование вывода действия может значительно увеличить производительность, так как позволяет избежать многих отнимающих время этапов при обработке запроса (например, обращение к базе данных). Конечно, недостатком кэширования является то, что вы сможете предоставлять только один ответ на все запросы, что подходит не для всех методов действий.

Фильтр OutputCache использует механизм кэширования вывода из ядра платформы ASP.NET, и если вы когда-либо использовали кэширование в приложениях Web Forms, то параметры конфигурации будут вам знакомы. Фильтр OutputCache можно использовать для контроля кэширования на стороне клиента, изменяя значения, отправляемые в заголовке Cache-Control. В таблице 16-10 показаны параметры, которые можно установить для этого фильтра.

Таблица 16-10: Параметры для фильтра OutputCache
Параметр Тип Описание
Duration int Обязательный - определяет, как долго вывод остается в кэше (в секундах).
VaryByParam string (список, разделенный точкой с запятой) Сообщает ASP.NET использовать новую запись кэша для каждой комбинации значений Request.QueryString и Request.Form, совпадающей с указанными именами. Значение по умолчанию, none, означает «не изменять по значениям строки запроса или формы». Другой вариант, *, означает «изменять по значениям строки запроса или формы». Если не указано иное, используется значение none.
VaryByHeader string (список, разделенный точкой с запятой) Сообщает ASP.NET использовать новую запись кэша для каждой комбинации значений, отправленных в названиях заголовков HTTP.
VaryByCustom string Если указано, ASP.NET вызывает метод GetVaryByCustomString в файле Global.asax, передает это произвольное значение строки в качестве параметра, что позволит вам генерировать свой собственный ключ кэша. Специальное значение browser позволяет изменять кэш по названию и старшему номеру версии браузера.
VaryByContentEncoding string (список, разделенный точкой с запятой) Позволяет ASP.NET создать отдельный кэш для каждого закодированного содержимого (например, gzip и deflate), которое может быть запрошено браузером.
Location OutputCacheLocation Указывает, где должен быть закэширован вывод. Он принимает одно из следующих значений : Server (только в памяти сервера), Client (только в браузере пользователя), Downstream (в браузере пользователя или любом промежуточном устройстве, поддерживающем кэширование HTTP, таком как прокси-сервер), ServerAndClient (объединение Server и Client), Any (объединение Server и Downstream) либо None (кэширование не используется). Если не указано иное, параметр принимает значение по умолчанию Any.
NoStore bool Если содержит true, то ASP.NET отправит заголовок Cache-Control: no-store в браузер, что укажет браузеру кэшировать страницу только в течение того времени, которое необходимо для ее отображения. Параметр используется только для защиты очень чувствительных данных.
CacheProfile string Параметр указывает ASP.NET получить параметры кэша из раздела под названием <outputCacheSettings> в файле Web.config.
SqlDependency string Если указать пару база данных/имя, данные в кэше будут удалены автоматически при изменении соответствующих данных из базы. Для этого требуется функция SQL cache dependency, которую довольно сложно настроить. Более подробно о ней можно почитать на http://msdn.microsoft.com/en-us/library/ms178604.aspx.

Одной из сильных сторон фильтра OutputCache является то, что его можно применять к дочерним действиям. Дочернее действие вызывается из представления с помощью вспомогательного метода Html.Action. Это позволяет нам выбирать, какие части ответа кэшируются и какие генерируются динамически. Мы обсудим дочерние действия подробно в главе 18, но в листинге 16-38 продемонстрируем работу с ними на примере простого контроллера под названием SelectiveCache.

Листинг 16-38: Контроллер SelectiveCache
using System;
using System.Web.Mvc;
namespace Filters.Controllers
{
	public class SelectiveCacheController : Controller
	{
		public ActionResult Index()
		{
			Response.Write("Action method is running: " + DateTime.Now);
			return View();
		}
		[OutputCache(Duration = 30)]
		public ActionResult ChildAction()
		{
			Response.Write("Child action method is running: " + DateTime.Now);
			return View();
		}
	}
}

Контроллер в листинге 16-38 определяет два метода действия:

  • Метод ChildAction, к которому применен фильтр OutputCache. Этот метод действия мы будем вызывать из представления.
  • Метод действия Index, который будет родительским действием.

Оба метода действий записывают время, которое потребовалось для их выполнения, в объект Response. В листинге 16-39 показано представление Index.cshtml (связанное с методом действия Index).

Листинг 16-39: Представление, который вызывает кэшированное дочернее действие
@{
	ViewBag.Title = "Index";
}
<h2>This is the main action view</h2>
@Html.Action("ChildAction")

Как видите, в конце представления мы вызываем метод ChildAction. Представление для этого метода показано в листинге 16-40.

Листинг 16-40: Представление ChildAction.cshtml
@{
	Layout = null;
}
<h4>This is the child action view</h4>

Запустите приложение и перейдите по ссылке /SelectiveCache. В первый раз вы увидите, что и родительское, и дочернее действие указывают в своих ответах одно и то же время. Если вы перезагрузите страницу (или перейдете по той же ссылке в другом браузере), то увидите, что время, указанное родительским действием, изменилось, но время дочернего действия осталось прежним. Это говорит нам о том, что мы видим кэшированный вывод от первоначального вызова, как показано на рисунке 16-15.

Рисунок 16-15: Эффект кэширования вывода дочернего действия

Подсказка

Возможно, вам придется обновить страницу еще раз, прежде чем начнется кэширование - это объясняется способом компиляции представлений при первом запуске приложения MVC (который мы рассмотрим в главе 18).