Ответ 1
Вы не можете использовать Session в Application_AuthenticateRequest, потому что он не связан в этот момент.
Я думаю, что вы можете использовать событие Application_AcquireRequestState.
Я использую VS2010 и создал простой asp. приложение веб-форм, используя сервер разработки для его проверки.
Я пытаюсь сохранить пользовательские данные - запрашиваемые с сервера sql - в сеансе, так как я не хочу получать доступ к базе данных в каждом запросе. Я использую методы "Application_AuthenticateRequest" и "Session_Start".
Первый раунд:
Вызывается аутентификацияRequest. Произошел следующий код:
public static void Initialize(string login_name, bool force_refresh)
{
HttpSessionState Session = HttpContext.Current.Session;
object o = Session == null ? null : Session["EMPLOYEE_DATA"];
if (force_refresh || o == null || o.GetType() != typeof(Employee) || (o as Employee).login_name!= login_name)
{
_current = UIManager.GetEmployee(login_name);
if (Session != null)
{
Session["EMPLOYEE_DATA"] = _current;
}
}
else
{
_current = (Employee)o;
}
}
Переменная _current является частным статическим полем, опубликованным через статическое свойство. В первом раунде сеанс имеет значение null, и я думаю, что это нормально, потому что Session_Start еще не вызван. Session_Start выглядит следующим образом:
protected void Session_Start(object sender, EventArgs e)
{
Session["EMPLOYEE_DATA"] = EmployeeFactory.Current;
}
В следующем раунде Session_Start не вызывается, конечно, но в AuthenticateRequest я не могу получить доступ к сеансу. HttpContext.Current.Session имеет значение null и this.Session ссылается на HttpException говорит, что "состояние сеанса недоступно в этом контексте".
Однако я могу получить доступ к сеансу из любого из событий page_load, но это плохая практика, я думаю, что ставил аутентификацию на каждый page_load. Любая идея, как я могу получить доступ к сеансу?
Спасибо за совет,
Петер
Вы не можете использовать Session в Application_AuthenticateRequest, потому что он не связан в этот момент.
Я думаю, что вы можете использовать событие Application_AcquireRequestState.
попробуйте использовать приведенный ниже код в page_Load
Response.AppendHeader("Refresh", Convert.ToString(Session.Timeout * 15) + ";
URL=SessionExpPage.aspx");