2014-12-26 4 views
0

Я хочу считать своим пользователям, и это ниже код, который находится в моей длл файл:Почему HttpContext.Current null во время события Session_End?

public static class UserCount 
{ 
    public static void add() 
    { 
     HttpContext.Current.Application.Lock(); 
     int count = (int) HttpContext.Current.Application["CountOfUsers"]; 
     count++; 
     HttpContext.Current.Application["CountOfUsers"]=count; 
     HttpContext.Current.Application.UnLock(); 
    } 

    public static void subtract() 
    { 
     HttpContext.Current.Application.Lock();//error : HttpContext.Current is null. why? 
     int count = (int) HttpContext.Current.Application["CountOfUsers"]; 
     count--; 
     HttpContext.Current.Application["CountOfUsers"]=count; 
     HttpContext.Current.Application.UnLock(); 
    } 
} 

Я дал Session.TimeOut=1; и через одну минуту ниже в Global.asax файла метод, это будет работать :

protected void Session_End(object sender, EventArgs e) 
    { 
     UserCount.subtract(); 
    } 

HttpContext.Current Почему нуль в методе subtract заставляя его бросить исключение?

+1

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

+0

'global.asax',' session_end' – Abhitalks

+0

@AndersAbel исправил это, что-нибудь еще осталось? – rene

ответ

4

В Session_End связь с браузером не обязательно связана с браузером, поэтому HttpContext не ссылается на то, почему он равен нулю.

Глядя на ваш код, вы, кажется, заинтересованы в кеше приложений. Это доступно через свойство Application экземпляра HttpApplication.

Если создать перегрузку на классе UserCount, который принимает HttpApplicationState вы будете прекрасно:

public static void subtract(HttpApplicationState appstate) 
{ 
    appstate.Lock(); 
    int count = (int) appstate["CountOfUsers"]; 
    count--; 
    appstate["CountOfUsers"]=count; 
    appstate.UnLock(); 
} 

Вы можете использовать это из Session_End так:

protected void Session_End(object sender, EventArgs e) 
{ 
    UserCount.subtract(Application); 
} 

Это работает, потому что global_asax является технически подклассом от HttpApplication, и поэтому все его члены доступны из файла global_asax.

Другая реализация substract может использоваться, когда есть HttpContext.

+0

Принял немного копания, чтобы подтвердить это, но я считаю, что вы правы. 'HttpContext.Current' зависит от контекста выполнения, который отличается или отсутствует при запуске' Session_End'. Состояние приложения по-прежнему доступно (внутренне это просто статический член); трюк - добраться до него, как вы показали. Интересно, я считаю, что код OP работал бы в IIS 6; Я помню, что я делал что-то подобное лет назад, без проблем. –

+0

Да, но ... если Session_End стреляет, разве у вас нет доступа к завершению этого сеанса? Чтобы очистить сеанс, заканчивающийся ... в событии окончания сеанса? – Triynko

+0

@Triynko да, вы можете через [HttpApplication.Session] (https://msdn.microsoft.com/en-us/library/system.web.httpapplication.session (v = vs.110) .aspx). Проблема OP заключалась в том, что они пытались получить доступ к этому сеансу с помощью HttpContext.Current, который может быть нулевым. – rene

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