ASP.NET Сеансовые ключи истекают после обратной передачи

#c# #asp.net #session

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

Вопрос:

Я новичок в ASP.NET сеансы, и я замечаю, что сеансовый ключ / переменные, сохраненные в сеансе, истекают после обратной передачи.

В приведенном ниже коде во время загрузки первой страницы я сохраняю некоторый XML в сеансовый ключ. Затем, если пользователь нажимает переключатель на веб-странице, это вызывает обратную передачу. После обратной передачи моя переменная сеанса, которую я сохранил вместе с XML-данными, теперь равна NULL.

Я подумал, что это может иметь какое-то отношение к сеансу.Время ожидания = 60, но я заметил, что даже если пользователь нажимает переключатель в течение первых 10 секунд после загрузки первой страницы, переменная сеанса по-прежнему равна NULL.

В doStuff() ниже xmlDoc равен NULL.

 public partial class InstallmentBillingPortal : System.Web.Ui.Page
{
    XmlDocument xmlDoc
    {
        get
        {
            return Session["xmlDocKey_3069"] == null ? null : (XmlDocument)Session["xmlDocKey_3069"];
        }
        set
        {
            Session["xmlDocKey_3069"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        Session.Timeout = 60;

        if (!this.IsPostBack)
        {
            var xml = File.ReadALlText(Server.MapPath(@"request.xml"));
            xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
        }
        else
        {
            doStuff();
        }
    }

    void doStuff()
    {
        if (xmlDoc != null)
        {
            // do something
        }
    }
}
  

Ответ №1:

Данные, хранящиеся внутри SessionState, доступны до тех пор, пока пользователь не закроет браузер или не истечет время ожидания сеанса. Следовательно, вы хотите проверить xmlDoc == null вместо IsPostBack .

Не устанавливайте тайм-аут состояния сеанса внутри страницы. Вместо этого вы хотите установить его внутри web.config. Например, 60 минут —

 <configuration>
  <system.web>         
     <sessionState timeout="60"></sessionState>
  </system.web>
</configuration>

XmlDocument xmlDoc
{
    get { return (XmlDocument) Session["xmlDocKey_3069"]; }
    set { Session["xmlDocKey_3069"] = value; }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (xmlDoc == null)
    {
        var xml = File.ReadAllText(Server.MapPath(@"request.xml"));
        xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xml);
    }

    doStuff();
}
  

К вашему СВЕДЕНИЮ: Если вы просто хотите, чтобы данные сохранялись во время обратной передачи, вы можете рассмотреть возможность использования состояния просмотра.

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

1. Я должен проверить IsPostBack, потому что многое зависит от того, загружается ли страница в первый раз. Если страница загружается в первый раз, мы фактически выполняем вызов WebService для извлечения XML-данных. Используя полученные XML-данные, мы заполняем множество сеток, переключателей, текстовых полей и других элементов управления. При обратной передаче мы обрабатываем вводимые пользователем данные и реагируем на любые запущенные события. Поэтому я должен использовать IsPostBack для выполнения этих определений. Если данные, хранящиеся внутри SessionState, должны быть доступны до тех пор, пока пользователь не закроет браузер или время ожидания сеанса, то почему мой SessionState отключен при обратной передаче?

2. Кроме того, я заметил, что в нашем файле Web.config для тайм-аута состояния сеанса уже установлено значение 10. Что все еще намного дольше, чем необходимо. Даже через 5 секунд после загрузки первой страницы моя переменная в SessionState исчезла. Тем не менее, я вижу там два других ключа. Так что я не думаю, что все состояние сеанса исчезло. Может быть, только моя переменная?

3. Если сеанс. Вызывается Abandon, теряется ли также ViewState?

Ответ №2:

asp.net предоставляет имя файла global.asax, в котором вы можете сохранять значения таких типов сеансов.Попробуйте использовать файлы, потому что их область действия до истечения основного сеанса страницы.И вы смогли бы следить за временем сеансов