我尝试设置一个电子商店。单击此图像按钮后,每个项目旁边都有asp:imagebutton
我正在检查会话变量session["basket"]
是否存在,如果没有,那么我在列表中添加值(实体类)和我在会话中添加此列表。
如果会话不为空,那么我将会话中的值检索到List并更改列表,然后将列表添加回会话。
问题:
出于某种原因,我突然松开了会话变量。我检查了我的手表(时间),这是不可预测的,有时它需要不到1分钟,有时3分钟,有时5分钟等....
为什么我会松开会话变量?
我用Google搜索,我发现 - 如果您使用Response.Redirect
- w / o false参数,或者您使用的是UpdatePanel
等,就会发生这种情况。
我暂时忘记了同一页面中的变量。
整个想法都放在一个会话变量中,并在第二个aspx
页面中检查并检索会话变量......但这并不总是有效,因为大多数情况下会话变量变为空。有时候它有效。
在我的页面中,任何用户(经过身份验证或无意义的用户),换句话说,任何没有登录的用户都应该订购(我会发送发票预付款)....
我没有使用webfarm,也没有使用web garden ...我只是检查了IIS - 网站 - 会话状态 - 它正在进行中,cookie设置=使用cookies,name = asp.net_sessionid,time-out = 20。 ......
请咨询?
C#
,ASPX 3.5
,IIS7.5
我的ASPX页面中没有PAGE_LOAD。
//我把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 - &gt;在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();
}
答案 0 :(得分:5)
听起来你的appdomain正在被回收。您的web.config
compilation
元素是否设置为debug
模式?在调试模式下,ASP.NET每15次动态编译重置appdomain。当发生这种情况时,如果您的会话存储在内存中(InProc
模式 - 默认值),它们将会丢失。
仅供参考,每当您的网站上发生文件更改时,都会发生动态编译,例如编辑ASPX文件,生成图像或更改web.config。
因此,要么将网站置于发布模式(<compilation debug="false" ... />
),要么将numRecompilesBeforeAppRestart
值从web.config
中的15增加,要么使用非易失性会话存储模式 - 例如SQL会话状态。
答案 1 :(得分:2)
你是否正在失去那个特定的变量? - 如果是这样,那么代码的某些部分可能就是这样做的。
如果你丢失整个会话对象,那么除非你的会话超时,另一个原因是如果你在你的服务器上使用inproc会话状态并且内存不足 - 这会回收你的工作进程,导致你丢失会话值。检查您的事件日志,看看是否是这种情况。
答案 2 :(得分:2)
你会惊讶地知道会话使用缓存的幕后故事!
看看下面的内容(你会发现有关会话问题的所有常见问题):
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
答案 3 :(得分:2)
梅苏特:
老实说,会话记忆可能非常容易。如果应用程序出现故障,您可以将其丢失,或者就像您说的那样,如果用户的会话重新启动,您可以将其丢失。通常,Asp.Net的选项是将数据存储在:
ViewState(存储为代码隐藏可访问的加密文本)
会话记忆(本质上是一本字典,但如上所述,有点像 易失性)
ASP.Net的状态服务(将值存储在单独的服务中) 处理。注意服务器场方案)
缓存
缓存
网址参数
这些方法中的每一种都在性能,内存或依赖于用户环境方面进行权衡。我会尝试一种不同的方法,看看这对你来说是否更健壮。
答案 4 :(得分:0)
检查您是否正在使用在多个网站/应用程序之间共享的Application Pool
,如果您与其他网站应用程序/网站共享AppPool
,请切换为单独的{{1} }。
最好的方法是使用基于服务器的会话状态,在这种情况下你可以忘记这些问题。见HOW TO: Configure SQL Server to Store ASP.NET Session State