HttpModules жизни в ASP.NET MVC - PullRequest
       16

HttpModules жизни в ASP.NET MVC

1 голос
/ 09 ноября 2010

Я нахожу код для подсчета онлайн-пользователей в Asp.Net. Я добавляю его в свой проект MVC, но он не работает. Существует специальный Http-модуль с функцией Init (), который вызывается при каждом запросе. где проблема.

init () должен запускаться один раз для всего жизненного цикла приложения, но он запускается при каждом запросе. Этот код хорошо работает на asp.net, но из-за метода init (), запускаемого в каждом запросе, он не работает на MVC.

public class OnlineUsersModule : IHttpModule
{
    private static Int32 _sessionTimeOut = 20; // Set Default to 20 Minutes
    private static List<OnlineUserInfo> _onlineUsers = null;

    public static List<OnlineUserInfo> OnlineUsers
    {
        get
        {
            CleanExpiredSessions();
            return _onlineUsers;
        }
    }

    private static void CleanExpiredSessions()
    {
        _onlineUsers.RemoveAll(delegate(OnlineUserInfo user)
        {
            return user.SessionStarted.AddMinutes(_sessionTimeOut) < DateTime.Now;
        });
    }

    #region IHttpModule Members

    public void Init(HttpApplication context)
    {
        _onlineUsers = new List<OnlineUserInfo>();

        // Get the Current Session State Module
        SessionStateModule module = context.Modules["Session"] as SessionStateModule;

        module.Start += new EventHandler(Session_Start);

    }


    private void Session_Start(object sender, EventArgs e)
    {
        HttpRequest Request = HttpContext.Current.Request;
        HttpApplicationState Application = HttpContext.Current.Application;
        HttpSessionState Session = HttpContext.Current.Session;

        // Get Session TimeOut
        _sessionTimeOut = HttpContext.Current.Session.Timeout;

        Application.Lock();

        OnlineUserInfo user = new OnlineUserInfo();

        user.SessionId = Session.SessionID;
        user.SessionStarted = DateTime.Now;
        user.UserAgent = !String.IsNullOrEmpty(Request.UserAgent)
            ? Request.UserAgent : String.Empty;
        user.IPAddress = !String.IsNullOrEmpty(Request.UserHostAddress)
            ? Request.UserHostAddress : String.Empty;
        if (Request.UrlReferrer != null)
        {
            user.UrlReferrer = !String.IsNullOrEmpty(Request.UrlReferrer.OriginalString)
                ? Request.UrlReferrer.OriginalString : String.Empty;
        }
        else
        {
            user.UrlReferrer = String.Empty;
        }
        if (HttpContext.Current.User.Identity.IsAuthenticated)
        {
            user.CurrentUser = HttpContext.Current.User;
        }

        // Add the New User to Collection
        _onlineUsers.Add(user);
        Application.UnLock();
    }

    public void Dispose()
    {
    }

    #endregion
}


public class OnlineUserInfo
{
    public String UserAgent { get; set; }
    public String SessionId { get; set; }
    public String IPAddress { get; set; }
    public String UrlReferrer { get; set; }
    public DateTime SessionStarted { get; set; }
    public IPrincipal CurrentUser { get; set; }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendFormat("UserAgent = {0} | ", UserAgent);
        sb.AppendFormat("SessionId = {0} | ", SessionId);
        sb.AppendFormat("IPAddress = {0} | ", IPAddress);
        sb.AppendFormat("UrlReferrer = {0} | ", UrlReferrer);
        sb.AppendFormat("SessionStarted = {0}", SessionStarted);
        return sb.ToString();
    }
}

Также я думаю, что есть еще одна проблема. Когда я добавляю точку останова в метод init (), после нажатия F10 он переходит в начало init (), значит, есть другие потоки, которые пытаются запустить init (), это проблема?

Ответы [ 2 ]

4 голосов
/ 09 ноября 2010

HttpModules живут в пуле.Процесс ASP.NET создает и инициализирует их (настраиваемое) число при запуске приложения и помещает его в пул.

Затем каждый раз, когда поступает запрос, экземпляр извлекается из пула и назначается для обслуживания запроса.В настоящее время инициализация отсутствует.Когда обработка запроса завершена, экземпляр помещается обратно в пул для последующего использования.

При большой нагрузке система может решить создать больше экземпляров HttpModules

HTH

3 голосов
/ 09 ноября 2010

Возможно, вы используете Cassini и каждый раз перекомпилируете свое приложение, нажимая F5 , что создает иллюзию, что метод Init вызывается при каждом запросе.

...