променливите на сесията са изгубени по някаква причина

Опитвам се да настроя електронен магазин. До всеки елемент имам asp:imagebutton, когато се щракне върху този бутон за изображение, проверявам дали променливата на сесията session["basket"] съществува или не, ако не, тогава добавям стойностите в списък (клас на обект) и добавям този списък в сесията.

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

Проблем:

По някаква причина внезапно губя променливата на сесията. Проверих часовника си (времето) и е непредсказуемо, понякога отнема по-малко от 1 минута, понякога 3 минути, понякога 5 минути и т.н.

защо губя променливата на сесията?

Потърсих в Google и открих - може да се случи, ако използвате Response.Redirect - без фалшив параметър или ако сте в UpdatePanel и т.н.

За момента губя променливата на същата страница.

Цялата идея е поставена в променлива на сесията и извършване на проверка и извличане на променливата на сесията във втората aspx страница... но това не винаги работи, защото в повечето случаи променливите на сесията стават празни. И понякога работи.

може ли някой да посъветва? какво и къде трябва да проверя? В някои страници на уебсайтове (google) съветват да се използва кеширане, но кеширането е базирано на приложение, така че всеки ще извлече една и съща стойност.

В моята страница всеки потребител (удостоверен или анономен потребител), с други думи всеки потребител без вход трябва да може да поръчва (ще изпратя фактура за предварително плащане)....

Не използвам уеб ферма, нито уеб градина... Току-що проверих IIS - уебсайт - състояние на сесията - В процес е, настройки на бисквитките = използване на бисквитки, име = 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 - уебсайт - състояние на сесията - В процес е, настройки на бисквитките = използване на бисквитки, име = asp.net_sessionid, изчакване = 20 .... Също така добавих sesstionsstate 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
добре, позволете ми да опитам Release mode.... но не мога да намеря думата 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 - уебсайт - състояние на сесията - В процес е, настройки на бисквитките = използване на бисквитки, име = 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 State, което е предпочитаният от мен метод. - person James McCormack; 25.07.2011
comment
@James McCormack -- А, да, напълно. - 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
това е CMS система dotnetnuke... Мисля, че нямам application_error -- но ще опитам protected override void OnError(EventArgs e) { base.OnError(e); lblMessage.Text = e.ToString(); } - person ethem; 25.07.2011
comment
Опитвам се да приложа състояние на сесията на sql сървъра: Получавам Unable to use SQL Server, тъй като ASP.NET версия 2.0 Session State не е инсталирана на SQL сървъра. Моля, инсталирайте ASP.NET Session State SQL Server версия 2.0 или по-нова. Проверих своята база данни и виждам, че необходимите таблици са създадени като aspnet_XXXX и т.н.. какъв може да е проблемът? - person ethem; 25.07.2011
comment
Трябва да помолите администраторите да го инсталират - person sll; 25.07.2011