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

我试着建立一个电子商店。 在每个项目旁边我有一个asp:imagebutton当点击这个图像按钮我正在检查会话varialbe session["basket"]存在,如果没有,那么我在列表中添加值(实体类)并且我添加会议中的此列表。

如果会话不为空,那么我将会话中的值检索到List并更改列表,然后将列表添加回会话。

问题:

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

为什么我会松开会话变量?

我用谷歌搜索,我发现 – 如果您使用Response.Redirect – w / o false参数,或者如果您在UpdatePanel等中,则会发生这种情况。

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

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

有人建议吗? 我需要检查什么和在哪里? 在一些网站页面(google)中,他们建议使用缓存,但缓存是基于应用程序的,因此每个人都将检索相同的值。

在我的页面中,任何用户(经过身份validation的用户或任何用户),换句话说,任何没有登录的用户都应该能够订购(我将发票发送到预先付款)….

我不是在使用webfarm,也不是使用web garden …我只是检查了IIS – 网站 – 会话状态 – 它正在进行中,cookie设置=使用cookies,name = asp.net_sessionid,time-out = 20 ….

请指教?

它是C#ASPX 3.5IIS7.5

我的ASPX页面中没有PAGE_LOAD。

//我把sessoin = null的唯一地方是一个linkbutton,其余的我没有把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(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 lws = new List(); 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 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(); 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.config。

因此要么将站点置于释放模式( ),要么在web.config中将numRecompilesBeforeAppRestart值从15增加,或者使用非易失性会话存储模式 – 例如SQL Session State。

你是否正在失去那个特定的变量? – 如果是这样,那么代码的某些部分可能就是这样做的。

如果您正在丢失整个会话对象,那么除非您的会话超时,否则另一个原因是如果您在服务器上使用inproc会话状态并且内存不足 – 这将回收您的工作进程,导致您丢失会话值。 检查事件日志以查看是否是这种情况。

梅苏特:

老实说,会话记忆可能非常容易。 如果应用程序出现故障,您可以将其丢失,或者就像您说的那样,如果用户的会话重新启动,您可以将其丢失。 通常,Asp.Net的选项是将数据存储在:

  • ViewState(存储为代码隐藏可访问的加密文本)

  • 会话记忆(本质上是一个字典,但如上所述,一点点
    挥发性)

  • ASP.Net的状态服务(将值存储在单独的进程中。注意服务器场方案)

  • cookies

  • 高速缓存

  • url参数

这些方法中的每一种都在性能,内存或依赖于用户环境方面进行权衡。 我会尝试一种不同的方法,看看它对你来说是否更健壮。

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

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