2015-09-18 2 views
0

Я не использую состояние сеанса для чего-либо. Я даже отключил его в своем Web.config и удалил сессионный модуль. Но теперь мне нужно заносить данные о посетителях и не знаю, как это сделать?Зарегистрировать данные посетителя, используя сеансы, или альтернативу?

Я хотя сделать это:

  • повторно активировать сеанс
  • ловить новые сеансы в void Session_Start(object, EventArgs) методе в Global.asax
  • журнала вещи интереса

Но я предпочел бы не для использования состояния сеанса, если только не нужно. Я помню, что сеансы заблокированы по умолчанию, что замедлит конвейер.

Итак, как мне регистрировать данные посетителей в ASP.NET MVC без состояния сеанса?

+0

Что вы подразумеваете под 'log visitor data'? –

+0

@RubensFarias Обычный ... IP, реферер и т. Д. –

ответ

1

Вы используете ActionFilterAttribute

Там как на сайте asp.net/mvc: http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/understanding-action-filters-cs

В общем, добавить класс как:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public sealed class LogVisitorsAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var descriptor = filterContext.ActionDescriptor; 
     var controller = descriptor.ControllerDescriptor.ControllerName; 
     var action = descriptor.ActionName; 
     var user = filterContext.HttpContext.User.Identity.Name; 

     // add your logging here 
     log(description, controller, action, user); 
    } 
} 

Вы можете тянуть все виды интересных «данных посетителя» в течение OnActionExecuting, таких как имена контроллеров/действий (как показано) и значения, переданные действию (параметры действия).

Затем вы можете добавить это к индивидуальным действиям

[LogVisitors] 
public ActionResult Index() 

или контроллер (или базовый контроллер)

[LogVisitors] 
public class HomeController 

или всех действий и контроллеров, добавив его в свой FilterConfig (который должен был уже существовать)

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new LogVisitorsAttribute()); 
    } 
} 
+0

Это умный подход. Но он будет срабатывать по каждому запросу. Как я могу сделать это только один раз за сеанс? Да, я знаю, как это звучит иронично! :) –

+0

Собственно, если вы комбинируете этот подход с тем, что я подробно описал в своем ответе, то это хорошая комбинация. Поэтому мне просто нужно добавить логику cookie в 'OnActionExecuting'. –

+0

Обмен cookie для сеанса не кажется хорошим компромиссом. Я не знаю специфики, но вы увеличиваете пропускную способность/клиентскую нагрузку, уменьшая обработку на стороне сервера. Вот ответ, который я нашел, что стоит прочитать: http://stackoverflow.com/a/1707263/2181514 –

0

Я думал о другом, но это грязно:

  • перехватывать в Application_BeginRequest() методе в Global.asax
  • сравнить печенье текущее время
  • если тогда это новая сессия, иначе обновление печенье с текущей временной меткой
  • если новый сеанс затем выполнить вход
  • > 20 минут

Минусы:

  • пожары для каждого запроса
  • изобретать колесо - это в основном состояние сеанса!

Плюсы:

  • Светлее состояния сеанса
  • не блокирует ничего

Надежда есть лучший способ, как это кажется грязным.

1

Как я могу регистрировать данные посетителей в ASP.NET MVC без состояния сеанса?

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

Тогда вам не нужно иметь состояние сеанса, беспокоиться о хранении данных или создавать собственное решение для его анализа.

+0

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

Смежные вопросы