переменные сеанса по какой-то причине потеряны - PullRequest
2 голосов
/ 25 июля 2011

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

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

Проблема:

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

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

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

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

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

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

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

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

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

Это C#, ASPX 3.5, IIS7.5

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

// единственное место, где я помещаю sessoin = null, это кнопка ссылки, в остальном я не помещаю null в сессию ["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();
    }

Ответы [ 5 ]

5 голосов
/ 25 июля 2011

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

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

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

2 голосов
/ 25 июля 2011

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

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

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

2 голосов
/ 25 июля 2011

Месут:

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

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

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

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

  • Печенье

  • Cache

  • Параметры URL

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

2 голосов
/ 25 июля 2011

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

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

0 голосов
/ 25 июля 2011

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

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

...