2014-10-21 1 views
0

Привет Я пытаюсь разработать функциональность, которая будет отслеживать каждый раз есть новый сеанс создан в веб-приложение ака входа пользователя в систему.Tracking начало новой сессии в C#

Я создал класс под названием "StateBag.cs"

using System; 
using System.Text; 

[Serializable()] 
public class StateBag 
{ 

    #region Business Methods 

    // To catch the event of a New Session // 
    private bool _NewSession = false; 
    public bool NewSession 
    { 
     get { return _NewSession; } 
     set { _NewSession = value; } 
    } 

    #endregion 

} 

на странице входа в систему, просто перед входом: -

// Declaration Region. // 
private StateBag _Bag; 



    if (Session.IsNewSession) 
    { 
     _Bag = new StateBag(); 
     _Bag.NewSession = true; 
     // ViewState["StateBag"] = _Bag; 
     Session["NewSession"] = _Bag; 
    } 

на главной странице, после успешного входа в систему: -

// Declaration region. // 
StateBag _Bag 
{ 
    get 
    { 
     return (StateBag)Session["NewSession"]; 
    } 
} 



    if (_Bag.NewSession == true) 
    { 

     // Do my stuff........ // 

     _Bag.NewSession = false; // set new Session back to false// 
    } 

Я м возникли проблемы при получении _Bag ... он возвращается как Null ...

поэтому сообщение об ошибке: - «Ссылка на объект не указывает на экземпляр объекта.»

Может ли кто-нибудь помочь мне восстановить свойство NewSession, которое я установил на странице «Истина»?

+1

Вместо развертывания собственного решения используйте событие 'Session_Start' в global.asax – Habib

+0

Могу ли я использовать Session_Start за пределами global.asax ?? Поскольку мне нужно иметь возможность выполнять функциональные возможности на основе информации о пользователе, например, имя пользователя, имя, идентификатор и т. Д. ... эти данные, насколько мне известно, недоступны из global.asax ... следовательно, моя попытка создать собственную решение. – Philo

+0

@Philo: вы можете начать отслеживать сеанс в 'global.asax', а затем * обновлять * этот пользовательский объект, чтобы включать сведения о пользователе, когда они становятся доступными. – David

ответ

3

Вы хранения в ViewState:

ViewState["StateBag"] = _Bag; 

и извлечения его из Session:

return (StateBag)Session["NewSession"]; 

ViewState и Session являются две совершенно разные вещи, они не разделяют одни и те же объекты. Вам нужно выбрать одно место для сохранения данных и всегда извлекать его из того же места.

Примечание: ViewState предоставляет данные в клиента, так что я не рекомендую использовать, что хранить все, что вы не хотите, чтобы клиент сможет увидеть/изменить.

+0

Ahh спасибо. Как сохранить его на сеансе? – Philo

+0

@Philo: 'Session [" NewSession "] = _Bag;' – David

+0

ahh duh .. просто понял это. – Philo