ASP.NET 2.0: проблема в Httpcontext.current.session.add () - PullRequest
0 голосов
/ 01 августа 2009

Может кто-нибудь помочь мне найти решение следующей проблемы.

  1. На веб-сайте ASP.NET: при событии Application_OnPostAuthenticate () любой код, который я пишу, выполняется для каждого запроса. поэтому из-за этого объекта индивидуальности countryid и weatherid вызываются каждый раз для каждого запроса (вызов для базы данных для значения). Это влияет на время отклика страницы и выполнение ненужного кода.

    void Application_OnPostAuthenticateRequest (отправитель объекта, EventArgs e) {

    // Get a reference to the current User
    
    IPrincipal objIPrincipal = HttpContext.Current.User;
    
    // If we are dealing with an authenticated forms authentication request
    
    if ((objIPrincipal.Identity.IsAuthenticated) && (objIPrincipal.Identity.AuthenticationType == "Forms"))
    {
        CustomPrincipal objCustomPrincipal = new CustomPrincipal();
        objCustomPrincipal = objCustomPrincipal.GetCustomPrincipalObject(objIPrincipal.Identity.Name);
        HttpContext.Current.User = objCustomPrincipal;
        CustomIdentity ci = (CustomIdentity)objCustomPrincipal.Identity;            
        HttpContext.Current.Cache["CountryID"] = FatchMasterInfo.GetCountryID(ci.CultureId);
        HttpContext.Current.Cache["WeatherLocationID"] = FatchMasterInfo.GetWeatherLocationId(ci.UserId);
        Thread.CurrentPrincipal = objCustomPrincipal;
    }
    

    }

Чтобы решить эту проблему, когда я пытаюсь изменить код следующим образом HttpContext.Current.Session.Add ("test", FatchMasterInfo.GetWeatherLocationId (ci.UserId);); вместо кеша я нашел ошибку «Ссылка на объект не установлена ​​для экземпляра объекта»

Я не знаю, можем ли мы хранить переменную сеанса внутри события Application_OnPostAuthenticate () или нет?

Ответы [ 4 ]

2 голосов
/ 01 августа 2009

Вы можете попытаться сделать это чуть позже в запросе, например, в событии PreRequestHandlerExecute:

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
    IPrincipal objIPrincipal = HttpContext.Current.User;
    if ((objIPrincipal.Identity.IsAuthenticated) && (objIPrincipal.Identity.AuthenticationType == "Forms"))
    {
        HttpSessionState session = HttpContext.Current.Session;
        CustomPrincipal objCustomPrincipal = new CustomPrincipal();
        if (session[objIPrincipal.Identity.Name] == null)
        {
            // get data from database or wherever
            objCustomPrincipal = objCustomPrincipal.GetCustomPrincipalObject(objIPrincipal.Identity.Name);
            CustomIdentity ci = (CustomIdentity)objCustomPrincipal.Identity;
            Object countryID = FatchMasterInfo.GetCountryID(ci.CultureId);
            Object weatherLocationID = FatchMasterInfo.GetWeatherLocationId(ci.UserId);
            // save in session (not cache as cache is application-wide, not per-user):
            session.Add(objIPrincipal.Identity.Name, objCustomPrincipal);
            session.Add(objIPrincipal.Identity.Name + "_CountryID", countryID);
            session.Add(objIPrincipal.Identity.Name + "_WeatherLocationID", weatherLocationID);
        }
        else
        {
            // already have custom principal object in session
            objCustomPrincipal = (CustomPrincipal)session[objIPrincipal.Identity.Name];
        }

        // set the custom principal object to context/thread
        HttpContext.Current.User = objCustomPrincipal;
        Thread.CurrentPrincipal = objCustomPrincipal;
    }
}
1 голос
/ 01 августа 2009

Перед добавлением значения в объект кеша, проверьте, существует ли он уже в кеше.

1 голос
/ 01 августа 2009

Возможно, вы не хотите получать доступ к сеансу в любом событии, которое происходит в каждом запросе. Некоторые запросы даже не имеют сессии (например, много вызовов веб-служб или вызовов WebResource.axd, которые загружают статические ресурсы).

0 голосов
/ 01 августа 2009

Возможно, у вас не включено состояние сеанса. Работает ли он где-нибудь еще (как на экране веб-формы)?

Найдите элемент <sessionState> в элементе system.web в web.config, убедитесь, что он включен (установите его в InProc, если у вас нет веб-фермы).

...