会话变量由于某种原因丢失

本文关键字:由于某种原因 变量 会话 | 更新日期: 2023-09-27 18:03:30

我尝试建立一个电子商店。旁边的每一个项目,我有一个asp:imagebutton,当这个imagebutton被点击,我检查会话变量session["basket"]是否存在,如果不存在,然后我在一个列表(实体类)中添加值,我在会话中添加这个列表。

如果会话不为空,则从会话中检索值并更改列表,然后将列表添加回会话。

问题:

由于某种原因,我突然丢失了会话变量。我检查了我的手表(时间),它是不可预测的,有时需要不到1分钟,有时3分钟,有时5分钟等....

为什么我丢失会话变量?

我谷歌了一下,我发现-如果你使用Response.Redirect - w/o假参数,或者如果你在UpdatePanel等,它可能会发生。

我暂时在同一页面中丢失了变量。

整个想法是放在一个会话变量和做签出和检索会话变量在第二个aspx页…但这并不总是有效,因为大多数情况下会话变量为空。有时它是有效的。

有人能给点建议吗?我需要在哪里办理什么手续?在一些网站页面(谷歌),他们建议使用缓存,但缓存是基于应用程序的,所以每个人都会检索到相同的值。

在我的页面中,任何用户(身份验证或匿名用户)换句话说,任何没有登录的用户都应该能够订购(我会发送发票以预付费用)....

我不使用webfarm,也不使用web garden…我刚刚检查了IIS -网站-会话状态-它在进程中,cookie设置=使用cookie,名称= asp.net_sessionid,超时= 20....

请建议吗?

C#, ASPX 3.5, IIS7.5

我的ASPX页面没有PAGE_LOAD。

//唯一的地方我把session =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:listview

中被定义为asp:imagebutton
 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();
    }

会话变量由于某种原因丢失

听起来你的appdomain正在被回收。你的web.config compilation元素设置在debug模式吗?在调试模式下,ASP。NET每15次动态编译重置appdomain。当这种情况发生时,如果您的会话存储在内存中(InProc模式-默认),它们将丢失。

仅供参考,动态编译将在您的网站上发生文件更改时发生,例如您编辑ASPX文件,或正在生成的图像或web。配置改变。

因此,要么将站点置于发布模式(<compilation debug="false" ... />),要么将numRecompilesBeforeAppRestart的值从web.config的15增加,或者使用非易失性会话存储模式-例如SQL会话状态。

您是否丢失了特定的变量?-如果是这样,那么很可能是你的代码的某些部分正在这样做。

如果您丢失了整个会话对象,那么除非您的会话超时,否则另一个原因是如果您在服务器上使用inproc会话状态并耗尽内存-这会回收您的工作进程,导致您丢失会话值。

你会惊讶地发现在后台会话使用缓存!

看看下面(你会发现所有关于会话问题的常见问题):

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

mesut:

老实说,会话内存可能非常不稳定。如果应用程序宕机,您可能会丢失它,或者像您说的,如果用户会话重新启动,您可能会丢失它。一般来说,Asp。Net将数据存储在:

  • ViewState(以加密文本形式存储,可由后台代码访问)

  • 会话内存(本质上是一个字典,但和上面一样,有一点
    )挥发性)

  • ASP。Net的状态服务(它将值存储在单独的的过程。注意服务器群场景)

  • 饼干
  • 缓存
  • Url参数

这些方法在性能、内存或依赖于用户环境方面都有权衡。我会尝试另一种方法,看看它是否更适合你。

检查您是否正在使用跨多个网站/应用程序共享的Application Pool,如果您与其他web应用程序/站点共享相同的AppPool -切换到单独的AppPool

最好的方法是使用基于服务器的会话状态,在这种情况下,您可以忘记这些问题。参见如何:配置SQL Server来存储ASP。. NET会话状态