Потеря данных переменной сеанса с одной страницы на другую в VB.NET

#asp.net #vb.net #session

#asp.net #vb.net #сессия

Вопрос:

Я немного новичок в VB.NET . У меня есть страница, которая устанавливает 2 переменные сеанса и перенаправляет на вторую страницу. На вторых страницах используется по крайней мере одна из переменных сеанса. Я могу сказать, потому что на второй странице, если переменная сеанса неверна, пользователь перенаправляется на страницу, доступ к которой запрещен. Вторая страница также использует рассматриваемую переменную сеанса. Он прочитает их и заполнит gridview на основе значения переменной. Я установил переменную следующим образом

 Session("ID") = Convert.ToInt32(a_value) 
  

и на второй странице я извлекаю переменную следующим образом

 a_page_variable = Session("ID")
  

Что я нахожу странным, так это то, что когда я запускаю этот код в Visual Studio, он работает как ожидалось, но когда я развертываю и запускаю его, я получаю 0 из моей переменной сеанса вместо истинного значения «a_value». Я попробовал несколько способов, например, убедиться, что типы данных совпадают от страницы к странице, и попробовать разные способы извлечения переменной, такие как

 Session("userID")
  

и

 CType(Session.Item("userID"), Int32)
  

Я также попытался посмотреть, что поступает на вторую страницу, используя
Response.Write
Я также пытался использовать SQL Profiler, чтобы увидеть, какой вызов выполняется для заполнения gridview, но мне не повезло. Gridview выдает мне пустой набор данных, и профилировщик не обнаруживает вызов, выполняемый из приложения. Я думал, что работа с переменными сеанса была довольно простой, но, очевидно, я чего-то не хватает.

Спасибо за твою помощь, Билли

Комментарии:

1. как настроено хранилище сеансов в вашем развернутом web.config? На что похожа среда развертывания? например, Возможно, существует еще один сервер, кроме IIS (например, в кластере, где каждый запрос может перенаправляться на другой физический сервер с помощью балансировщика нагрузки — я спрашиваю это, потому что в этом сценарии серверам необходимо совместно использовать данные сеанса, возможно, хранящиеся в базе данных)? Без информации о конфигурации и коде трудно дать конкретный совет. Описания кода полезны, но на самом деле их довольно сложно исправить!

2. Я вроде как новичок в .NET и не знаю, как ответить на первый вопрос. Как я могу это выяснить? Что касается среды развертывания, существует только один сервер IIS

3. Заглянув в ваш файл web.config. c-sharpcorner.com/UploadFile/484ad3/session-state-in-Asp-Net это может помочь вам разобраться в различных вариантах хранения сеансов и в том, что искать в файле.

4. Спасибо. Я проверю это.

5. хорошо, тогда, похоже, мы можем это исключить. Как отмечается в приведенном ниже ответе, существует ряд других возможных причин проблем с сеансом. Поскольку это кажется проблемой среды (т. Е. Это работает в локальной среде, но не на сервере), то менее вероятно, что ваш код неисправен. Поскольку у нас нет никакой видимости вашей среды, на самом деле довольно сложно сделать что-либо большее, чем вносить предложения о возможных областях для поиска. На самом деле мне больше нечего добавить, кроме того, что уже приведено ниже, извините.

Ответ №1:

Одной из возможностей (и единственной, о которой можно догадаться, учитывая, как мало у нас информации) может быть response.redirect, вызывающий завершение работы приложения из-за исключения.

При перенаправлении вы хотите всегда передавать false, а затем вызывать complete request.

 Response.Redirect(urlstring, False)
Response.CompleteRequest()
  

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

Кроме того, разрешите виртуальные пути, поскольку некоторые браузеры (особенно мобильные) могут воспринимать эти перенаправления как полностью новые запросы, тем самым генерируя новые токены сеанса.

 Dim urlstring As String
urlstring = Page.ResolveUrl("~/default.aspx")
  

тем не менее, существует ряд возможных причин для этой ситуации.

  1. Пул приложений перезапускается
  2. Перезапуск домена приложения
  3. Код, неожиданно меняющий значение
  4. AV возится с файлами
  5. развернуто на веб-ферме

С приведенным выше описанием у нас просто недостаточно информации для реального устранения неполадок.

Комментарии:

1. Спасибо за ваш вклад, Стивен. Я попытался разрешить URL-адрес и добавить false к перенаправлению, но у меня все еще возникают те же проблемы. Я устанавливаю и извлекаю переменные сеанса в событиях Page_Load на обеих страницах.

2. Спасибо за ваш вклад, Стивен. Я попытался разрешить URL-адрес и добавить false к перенаправлению, но у меня все еще возникают те же проблемы. Я устанавливаю и извлекаю переменные сеанса в событиях Page_Load на обеих страницах. Это с первой страницы Session("ID") = Convert.ToInt32(a_value) urlString = Page.ResolveUrl("~/User.aspx") Response.Redirect(urlString, False) . На второй странице у меня есть это a_page_variable = Session("ID") SqlSource.SelectParameters("ID").DefaultValue = a_page_variable .

3. Стивен, у меня не выполняется ни один из перечисленных вами пунктов. Существует один пул приложений, домен не был перезапущен, и приложение не было развернуто на веб-ферме. Я не получал никаких сообщений от AV. Есть ли какая-либо другая информация, которую я могу предоставить, которая могла бы помочь?

4. Действительно хороший ответ. У меня есть похожая программа, но не такая же. Мои значения сеанса отлично работают дома … однако, когда я использую их в своей локальной сети из 6 компьютеров в офисе. У первых 6 пользователей нет никаких проблем, и сеансы работают нормально … однако, когда они переходят к следующим 6 пользователям и они входят в свои учетные записи.. переменные сеансов становятся нулевыми, но в конечном итоге возвращаются к нормальному состоянию после входа в систему еще 2-4 раза… и странная ошибка, которую я не могу понять… есть идеи?

Ответ №2:

Спасибо Адисону, Стивену Райтону и всем остальным, кто попытался помочь мне разобраться в этом. Я смог выяснить, что происходит, добавив код, который записывался в файл журнала на сервере. Нашел код регистрации здесь. Я обнаружил, что я так и не добрался до кода, который устанавливает переменную сеанса, и это причина, по которой она никогда не заполнялась на второй странице. Я пытался получить имя входа для пользователя с помощью Environment.UserName , которое вернет имя пользователя человека, который в данный момент вошел в операционную систему. Но что я действительно хотел сделать, так это получить имя входа пользователя, который посещал мой сайт. Для этого я использовал User.Identity.Name . Это отлично работает, когда вам нужно знать, какой пользователь из домена Active Directory посещает ваш сайт.