OutputCache и запись уникальных просмотров?

Изображение У меня есть представление, кэшированное с атрибутом OutputCache, но мне все еще нужно увеличить счетчик, который записывает, что страница была просмотрена, как я могу это сделать?

Я думал о создании собственного пользовательского атрибута ActionFilterAttribute и использовании порядка выполнения фильтра действий для записи этого... но я не уверен, что это сработает.

eg.

[IncrementViewCountFilter(Order=1)]
[OutputCache(Duration=60,Order=2)]
public ActionResult Index(int questionId)
{ ... }

Во-первых, мое предположение заключается в том, что если вызывается OutputCache, а страница кэшируется, то код контроллера запускаться не будет.

Следующая проблема, которую я предполагаю, заключается в том, что IncrementViewCountFilter не будет знать об идентификаторе вопроса, поэтому как он узнает, что увеличивать (потому что он выполняется до выполнения основного кода индекса).

Во-вторых, если бы IncrementViewCountFilter знал идентификатор вопроса... и он получает много обращений, вы бы не хотели, чтобы он все время писал в БД... но только когда доходит до определенного числа... а затем сбрасывает ' выход.

У кого-нибудь есть мысли?


person Pure.Krome    schedule 10.12.2008    source источник


Ответы (4)


Ну, у вас есть несколько вариантов.

Кэширование пончиков

Один из вариантов на стороне сервера — «Кэширование пончиков». Кэширование пончика позволяет кэшировать большую часть страницы, а части страницы не кэшировать (отверстие в середине пончика). Кольцевое кэширование описано здесь , и я использовал его с большим успехом.

Трекер на основе изображений

Другим вариантом является наличие изображения на странице, которое фактически загружает действие на стороне сервера, которое записывает обращение. Это будет выглядеть как

<img src="/controller/action"> 

на странице, где действует действие пустое изображение в конце.

Отслеживание на стороне клиента

Последний вариант — это отслеживание на стороне клиента, когда некоторый скрипт запускается на стороне клиента и использует AJAX для вызова чего-либо на сервере для записи обращения. Google использует что-то подобное для своего пакета Analytics. Если вы находитесь в том же домене, что и ваш механизм отслеживания... например, если ваша главная страница:

http://www.domain.com/home/action

и трекер включен

http://www.domain.com/tracking/action

тогда вы должны быть в порядке.

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

person Dan Esparza    schedule 10.12.2008
comment
Обратите внимание, что кольцевое кэширование не работает в ASP.NET MVC 2 и более поздних версиях. - person James Sulak; 28.02.2011

Фильтр может получить questionId из ActionExecutingContext.ActionParameters, который передается в OnActionExecuting. Что касается кеширования счетчиков посещений, то используйте кеш. :)

person Craig Stuntz    schedule 10.12.2008
comment
Можете ли вы предоставить пример кода для получения questionId из RouteData, пожалуйста? - person Pure.Krome; 11.12.2008
comment
Извините, вам нужен ActionExecutingContext.ActionParameters. Это передается в ActionFilterAttribute.OnActionExecuting. (Во всяком случае, в Preview 5.) - person Craig Stuntz; 11.12.2008
comment
Кьюл! с кешированием хитов, в кеше.. ага. я собирался это сделать, но ключ был в том, КАК и КОГДА сбросить этот счет (то есть: сохранить эту информацию). Я думал о том, чтобы, возможно, создать таймер при запуске приложения и позволить ему сбрасывать каждые xxx минут? - person Pure.Krome; 11.12.2008

Вы также можете использовать HttpModule, который является хорошим вариантом, поскольку его можно использовать для страниц и других ресурсов, которые не используют конвейер MVC. Я использую комбинацию кэширования Donut (http://mvcdonutcaching.codeplex.com/), фильтра MVC и HttpModule для записи всех типов аналитики для кэшированных страниц.

person Brad Urani    schedule 13.07.2012

Я не знаю о стороне MVC, но если бы я делал это в WebForms, это звучит так, как будто это был бы кандидат на кэш вывода замена, также известная как кэширование пончиков.

person PhilPursglove    schedule 10.12.2008