2013-07-09 1 views
0

У меня есть следующий код, который воспроизводит мой вопрос:Почему Session.Remove не удаляет объект сеанса, если за ним следует исключенное исключение?

protected void Page_Load(object sender, EventArgs e) 
{ 
    var test = Session["test"] as string; 
    if (test == null) 
    { 
     Session["test"] = "test"; 
     Response.Redirect(Request.Path, false); 
    } 
    else 
    { 
     Session.Remove("test"); 
     throw new Exception(); 
    } 
} 

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

Если вы поместите часы в бросок, вы увидите, что объект сеанса удален.

Редактировать # 1: После небольшого тестирования я заметил, что это поведение присутствует только в режиме состояния StateServer. Я тестировал против InProc и, похоже, работает так, как ожидалось. Я не могу протестировать режим SQL Server.

ответ

0

Я считаю, что ваша проблема заключается в том, что вы обрабатываете недостаток значения в Session так же, как если бы он был пустым (или пробелом).

Я бы рекомендовал следующий код вместо:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Does the value exist in Session? 
    if(null != Session["test"]) 
    { 
     // No, so throw an exception 
     throw new Exception(); 
    } 

    // Grab the value from Session and cast it to a string 
    var test = Session["test"] as string; 

    // Is the string null or blank? 
    if (string.IsNullOrWhiteSpace(test)) 
    { 
     // Yes, so give it a value of 'test' and redirect to another page 
     Session["test"] = "test"; 
     Response.Redirect(Request.Path, false); 
    } 
    else 
    { 
     // The value was not null or blank so rip it out of Session 
     Session.Remove("test");  
    } 
} 
+1

Карл, я думаю, что мой пример может быть немного запутанным. Я не намерен бросать исключение, если объект сеанса не существует. Мое намерение состояло в том, чтобы показать, что исключение (принудительное в моем примере) исключает удаление объекта сеанса. Я также исправил условие для проверки нулевой, а не пустой строки. – ddechant