OutputCache и запись уникальных просмотров? - PullRequest
2 голосов
/ 10 декабря 2008

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

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

например.

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

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 10 декабря 2008

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

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

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

Основанный на изображении трекер

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

<img src="/controller/action"> 

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

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

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

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

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

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

тогда с тобой все будет в порядке.

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

1 голос
/ 13 июля 2012

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

1 голос
/ 10 декабря 2008

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

0 голосов
/ 10 декабря 2008

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

...