2010-11-09 3 views
1

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

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(); 
    } 
} 

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

+0

Возможно, вы захотите опубликовать дополнительную информацию о том, что он должен делать и что именно не работает. – rboarman

+0

Я пытаюсь добавить дополнительную информацию. – Yucel

ответ

4

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

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

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

НТН

+0

hmm ok Я понимаю, так что этот код не будет работать хорошо. Но я беру это из http://blog.sb2.fr/post/2008/12/01/HowTo-Get-Current-Online-Users-Count-and-Infos-with-ASPNET.aspx Если этот код не работает, почему он пишет это в свой блог – Yucel

3

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