переменные сеанса потеряны по какой-то причине

Пытаюсь настроить интернет-магазин. Рядом с каждым элементом у меня есть asp:imagebutton, когда нажимается эта кнопка изображения, я проверяю, существует ли переменная сеанса session["basket"] или нет, если нет, то я добавляю значения в список (класс сущности), и я добавляю этот список в сеанс.

если сеанс не пуст, я извлекаю значения из сеанса в список и изменяю список, а затем добавляю список обратно в сеанс.

Проблема:

По какой-то причине я внезапно теряю переменную сеанса. Я проверил свои часы (время), и это непредсказуемо, иногда это занимает менее 1 минуты, иногда 3 минуты, а иногда 5 минут и т. Д....

почему я теряю переменную сеанса?

Я погуглил и нашел - это может произойти, если вы используете Response.Redirect - без ложного параметра или если вы находитесь в UpdatePanel и т. д.

На данный момент я теряю переменную на той же странице.

Вся идея помещается в переменную сеанса и выполняет проверку и извлекает переменную сеанса на второй странице aspx... но это не всегда работает, потому что в большинстве случаев переменные сеанса становятся пустыми. И иногда это работает.

может кто-нибудь посоветовать? что и где нужно проверить? На некоторых страницах веб-сайта (google) рекомендуется использовать кеширование, но кеширование основано на приложении, поэтому все получат одно и то же значение.

На моей странице любой пользователь (аутентифицированный или любой другой пользователь), другими словами, любой пользователь без входа в систему должен иметь возможность сделать заказ (я отправлю счет для оплаты вперед)....

Я не использую ни веб-ферму, ни веб-сад... Я только что проверил IIS - веб-сайт - состояние сеанса - он в процессе, настройки файлов cookie = использовать файлы cookie, имя = asp.net_sessionid, время ожидания = 20....

пожалуйста посоветуй?

It's C#, ASPX 3.5, IIS7.5

У меня нет PAGE_LOAD на моей странице ASPX.

// единственное место, где я помещаю sessoin=null, это кнопка ссылки, в остальном я не помещаю null в session["basket"]....

protected void lnkDeleteAllSelected_Click(object sender, EventArgs e)
    {
        Session["Basket"] = null;
        ReloadBasketItems();

    }

 protected override void OnInit(EventArgs e)
    {

        base.OnInit(e);
        //System.Diagnostics.Debugger.Break();

        lvJuridisch.ItemDataBound += new EventHandler<ListViewItemEventArgs>(this.lv_ItemDataBound);
        lvJuridisch.DataBound += new EventHandler(lv_DataBound);

    }

imgButtonAddtoBasket -> определяется как asp:imagebutton в asp:listview

 protected void imgButtonAddtoBasket_Click(object sender, ImageClickEventArgs e)
    {
        ListViewDataItem lvi = ((sender as ImageButton).NamingContainer) as ListViewDataItem;
        DataKey currentDataKey = (lvi.NamingContainer as ListView).DataKeys[lvi.DataItemIndex];
        WebShopInfo SingleItem = new WebShopInfo();
        SingleItem.cd_type_pub = currentDataKey[0].ToString();
        SingleItem.no_pub = currentDataKey[1].ToString();
        SingleItem.no_suite_pub = Convert.ToInt32(currentDataKey[2]);
        SingleItem.cd_langue = Convert.ToChar(currentDataKey[3]);
        SingleItem.lb_titre_red = (lvi.FindControl("HiddenfieldProductRed") as HiddenField).Value;

        SingleItem.m_price = Convert.ToDecimal((lvi.FindControl("hiddenField_M_Price") as HiddenField).Value);
        SingleItem.nm_price = Convert.ToDecimal((lvi.FindControl("hiddenField_NM_Price") as HiddenField).Value);
        SingleItem.mt_pourc_tva = Convert.ToDecimal((lvi.FindControl("hfBTW") as HiddenField).Value);


        List<WebShopInfo> lws = new List<WebShopInfo>();
        if (Session["Basket"] == null)
        {

            //Session is empty so add listview to the session....
            //Session.Timeout = 20;  -- I tried this but this is not working too...
            lws.Add(SingleItem);
            Session["Basket"] = lws;
        }
        else
        {
            //Session is not empty so get asp:listview from the session.
            lws = Session["Basket"] as List<WebShopInfo>;

            WebShopInfo wsi = lws.Where(a => a.cd_type_pub == SingleItem.cd_type_pub &&
                                            a.no_pub == SingleItem.no_pub &&
                                            a.no_suite_pub == SingleItem.no_suite_pub &&
                                            a.cd_langue == SingleItem.cd_langue).SingleOrDefault<WebShopInfo>();
            if (wsi != null)
                lws.Remove(wsi);

            if (SingleItem.Count > 0)
                lws.Add(SingleItem);
            Session["Basket"] = lws;
        }

        ReloadBasketItems();
    }

person ethem    schedule 25.07.2011    source источник
comment
Вы на веб-ферме? Как настроена ваша сессия?   -  person V4Vendetta    schedule 25.07.2011
comment
Вы находитесь на веб-ферме или в веб-саду, если это так, вы должны хранить состояние сеанса на сервере состояний или SQL-сервере. Второй вариант: проверьте свою веб-конфигурацию на наличие тега ‹sessionState timeout=время в минутах/›, если он есть, и это короткое время ваш сеанс истекает.   -  person maniacneron    schedule 25.07.2011
comment
Вы проверяли в нескольких браузерах?   -  person V4Vendetta    schedule 25.07.2011
comment
@V4Vendetta/@maniacneron: Я не использую ни веб-ферму, ни веб-сад... Я только что проверил IIS - веб-сайт - состояние сеанса - он в процессе, настройки файлов cookie = использовать файлы cookie, имя = asp.net_sessionid, время ожидания = 20 .... Я также добавил sessionstate timeout=20 в web.config... он потерян.   -  person ethem    schedule 25.07.2011
comment
Можете ли вы опубликовать код, надеюсь, у вас нет чего-то вроде Session["basket"] = null в разделе page_load?   -  person V4Vendetta    schedule 25.07.2011
comment
@v4vendetta: я только что добавил код в свой POST.   -  person ethem    schedule 25.07.2011
comment
Вы поняли это в конце концов?   -  person James McCormack    schedule 26.07.2011


Ответы (5)


Похоже, ваш домен приложения перерабатывается. Ваш элемент web.config compilation установлен в режим debug? В режиме отладки ASP.NET сбрасывает домен приложения каждые 15 динамических компиляций. Когда это произойдет, если ваши сеансы хранятся в памяти (режим InProc — по умолчанию), они будут потеряны.

К вашему сведению, динамическая компиляция будет происходить всякий раз, когда на вашем сайте происходит изменение файла, например, вы редактируете файл ASPX, создаете изображение или изменяете web.config.

Так что либо переведите сайт в режим выпуска (<compilation debug="false" ... />), либо увеличьте значение numRecompilesBeforeAppRestart с 15 в web.config, либо используйте режим энергонезависимого хранения сеансов — например, Состояние сеанса SQL.

person James McCormack    schedule 25.07.2011
comment
хорошо, позвольте мне попробовать режим выпуска .... но я не могу найти слово numberOfCompilations в web.config. - person ethem; 25.07.2011
comment
Извините, должно быть numRecompilesBeforeAppRestart. Дополнительные сведения см. здесь: msdn.microsoft.com/en-us/library/ s10awwz0.aspx - person James McCormack; 25.07.2011

Вы теряете только эту конкретную переменную? - Если это так, то, вероятно, это делает какая-то часть вашего кода.

Если вы теряете весь объект сеанса, то, если ваш сеанс не истек, другая причина заключается в том, что если вы используете состояние сеанса inproc на своем сервере и у вас закончилась память - это перезапускает ваш рабочий процесс, что приводит к потере значения сеанса . Проверьте журнал событий, чтобы узнать, так ли это.

person Srikanth Venugopalan    schedule 25.07.2011
comment
Я не использую ни веб-ферму, ни веб-сад... Я только что проверил IIS - веб-сайт - состояние сеанса - он в процессе, настройки файлов cookie = использовать файлы cookie, имя = asp.net_sessionid, время ожидания = 20.... Где можно В логе вижу: посмотрел в eventviewer - административные события -› не могу найти здесь информацию... где проверить? какой журнал? - person ethem; 25.07.2011
comment
Мне просто интересно, что в коде может быть причиной этого? В настоящее время у меня такая же проблема, но только некоторые переменные теряются. Я никогда не переназначаю значение внутри переменной, но часто использую эту переменную. - person Axelle; 08.06.2020

вы будете удивлены, узнав, что за кулисами сеанс использует кеш!

взгляните на приведенное ниже (вы найдете все распространенные проблемы, связанные с проблемой сеанса):

http://mmtripathi.blogspot.com/2008/09/session-lost-problem-after.html

http://zeeshanumardotnet.blogspot.com/2009/07/why-sessions-are-terminatedloss.html

http://classicasp.aspfaq.com/general/why-won-t-my-session-variables-stick.html

person Massimiliano Peluso    schedule 25.07.2011
comment
да, но большинство проблем общие - person Massimiliano Peluso; 25.07.2011

Месут:

Честно говоря, сессионная память может быть очень неустойчивой. Если приложение выйдет из строя, вы можете его потерять, или, как вы сказали, если сеанс пользователя будет перезапущен, вы можете его потерять. Как правило, для Asp.Net можно хранить данные в:

  • ViewState (хранится как зашифрованный текст, доступный вашему коду программной части)

  • Сеансовая память (по сути, словарь, но, как указано выше, немного
    изменчива)

  • Служба состояний ASP.Net (которая хранит значения в отдельном процессе. Следите за сценариями фермы серверов)

  • Печенье

  • Кэш

  • Параметры URL

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

person davecoulter    schedule 25.07.2011
comment
Пользователь выбирает элемент, и в обратной передаче я ловлю выбранный элемент и помещаю его в список, а затем в сеанс, чтобы сохранить значения после обратной передачи: я помещаю сеанс, потому что мне нужно значение на другой странице.... но переменная сеанса теряется на той же странице - person ethem; 25.07.2011
comment
Вы не упомянули состояние SQL, которое я предпочитаю. - person James McCormack; 25.07.2011
comment
@Джеймс МакКормак - Ах да, полностью. - person davecoulter; 25.07.2011

Проверьте, используете ли вы Application Pool, который используется несколькими веб-сайтами/приложениями. Если вы используете один и тот же AppPool с другим веб-приложением/сайтом, переключитесь на отдельный AppPool.

Лучше всего использовать серверное состояние сеанса, в этом случае вы можете забыть о таких проблемах. См. раздел КАК: настроить SQL Server для сохранения состояния сеанса ASP.NET.

person sll    schedule 25.07.2011
comment
@mesut: Вы сталкиваетесь с какими-либо ошибками на уровне Application_Error()? - person sll; 25.07.2011
comment
это система dotnetnuke CMS... Я думаю, что у меня нет application_error -- но я попробую защищенное переопределение void OnError(EventArgs e) { base.OnError(e); lblMessage.Text = e.ToString(); } - person ethem; 25.07.2011
comment
Я пытаюсь применить состояние сеанса SQL Server: я получаю сообщение Невозможно использовать SQL Server, поскольку состояние сеанса ASP.NET версии 2.0 не установлено на сервере SQL. Пожалуйста, установите ASP.NET Session State SQL Server версии 2.0 или выше. Я проверил свою базу данных и вижу, что необходимые таблицы созданы, например, aspnet_XXXX и т. Д. В чем может быть проблема? - person ethem; 25.07.2011
comment
Вы должны попросить админов установить его - person sll; 25.07.2011