Вопрос

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

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

например.

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

<img src="/controller/action"> 

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

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

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

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

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top