2009-08-28 2 views
0

Im using outproc session, который управляется aspnet_state. Иногда я получаю ошибки времени выполнения, говоря, что сеанс недействителен. Поэтому я хотел проверить, действителен ли сеанс для каждого запроса, который я делаю. Но я не мог найти правильный способ сделать это, как в this Question, используя Java.Как проверить, действителен ли сеанс ASP?

Вот код, который я использую прямо сейчас в событии page_preinit. Он выглядит уродливым, но он работает.

  Try 
       Dim x = Session.Keys().Item(0) 
      Catch ex As Exception 
       Session.Clear() 
      End Try 

Означает ли кто-нибудь лучший подход?

Thanks

+0

Что точное сообщение во время выполнения вы получите? Он не звонит в колокольчик и то, как вы тестируете работу выше, на основе исключения нулевой ссылки, которое также произойдет для нового/пустого сеанса вместо недопустимого. – olle

+0

Используете ли вы проверку подлинности на основе форм? – PortageMonkey

+0

olle: сеанс действительно существует (NOT NULL), но доступ к любому элементу вызывает исключение. Это происходит только время от времени и только на моей машине dev, так как я делаю много сборки/перестройки. – Youssef

ответ

0

На самом деле я решил проблему, проверив первый элемент сеанса (session.item (0)) Я поставил код в try catch. если есть исключение, я просто очищаю сессию. Этот код находится в базовой странице для всех моих страниц.

поэтому в случае PreInit мой код похож на этот

Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit 
    Try 
     Dim x = Session.Keys().Item(0) 
    Catch ex As Exception 
     Session.Clear() 
    End Try 
End Sub 

Вроде бы некрасивым, но это не решит мою проблему.

Спасибо всем.

1

Вы можете попробовать проверить объект контекста.

C#

if(Context.Session != null) 
{ 
    //Redirect to login page etc 
} 

VB (используется C# для VB конвертер here..not уверен, если это правильно)

If Context.Session IsNot Nothing Then 
    'Redirect to login page etc 
End If 

При использовании проверки подлинности форм и настроена правильно, это должен перенаправить для вас. Если вам все еще нужно быть явным, я бы порекомендовал разместить этот тип кода в Global.asax или базовом классе, из которого могут извлекаться все ваши страницы, а не добавлять его к каждому запросу.

+0

Код, который я использую, находится на базовой странице. Но сеанс действительно существует, он не является нулевым. Доступ к элементу eny вызовет исключение. Просто перезапустив сеанс asp_net, проблема исчезнет или в коде я его очистил. Код, который я использую, решает мою проблему, но я задаюсь вопросом, есть ли другие, чтобы это сделать. – Youssef

+0

Хм. это звучит так, как будто у вас проблема с информацией о сеансе (ключами), которая не заполняется правильно ... а не таймаут сеанса. У нас были аналогичные проблемы с использованием базы данных aspnet_state. Наш подход заключался в попытке получить доступ к ключу сеанса в дополнение к проверке нулевого значения, чтобы проверить, что DB aspnet_state вернул действительный объект сеанса. Что касается основной проблемы с неудачной сессией, возвращаемой с помощью aspnet_state DB ... еще предстоит решить эту проблему – PortageMonkey

0

Просто проверьте Session.Count вместо того, чтобы пытаться получить доступ первого элемента в блоке обработки ошибки ...

+0

Нет, счет не помог, так как счет был правильным. В сеансе есть элементы, но они повреждены для некоторая причина.Вы можете реплицировать это, используя сеанс proc после его запуска в течение некоторого времени (с большим доступом), он начнет сбой. Это может быть проблема с памятью. Я не исследовал ее полностью, но попытка catch отлично работает для меня. – Youssef

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