【发布时间】:2011-10-12 11:49:44
【问题描述】:
我尝试建立一个电子商店。单击此图像按钮时,在每个项目旁边我都有一个asp:imagebutton 我正在检查会话变量session["basket"] 是否存在,如果不存在,那么我将值添加到列表(实体类)中,然后将此列表添加到会议。
如果会话不为空,则我将会话中的值检索到列表中并更改列表,然后将列表添加回会话。
问题:
出于某种原因,我突然失去了会话变量。我检查了我的手表(时间),它是不可预测的,有时不到 1 分钟,有时 3 分钟,有时 5 分钟等等......
为什么我会丢失会话变量?
我用谷歌搜索发现 - 如果您使用 Response.Redirect - w/o false 参数,或者如果您使用 UpdatePanel 等,就会发生这种情况。
我暂时在同一页面中丢失了变量。
整个想法是放在一个会话变量中,并在第二个aspx 页面中检查并检索会话变量......但这并不总是有效,因为大多数情况下会话变量会变为空。有时它会起作用。
有人可以建议吗?我需要检查什么以及在哪里检查? 在某些网站页面(谷歌)中,他们建议使用缓存,但缓存是基于应用程序的,因此每个人都会检索相同的值。
在我的页面中,任何用户(经过身份验证的用户或任何匿名用户),换句话说,任何没有登录的用户都应该能够订购(我将发送发票预付款)....
我没有使用 webfarm,也没有使用 web garden...我只是检查了 IIS - 网站 - 会话状态 - 正在进行中,cookie 设置 = 使用 cookie,名称 = asp.net_sessionid,超时 = 20。 ...
请指教?
我是C#、ASPX 3.5、IIS7.5
我的 ASPX 页面中没有 PAGE_LOAD。
// 我放 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: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();
}
【问题讨论】:
-
你在网络农场吗?您的会话是如何配置的?
-
如果您在网络农场或网络花园中,您应该将会话状态存储在状态服务器或 SQL 服务器上。第二个选项检查您的网络配置是否有
标记(如果有)并且您的会话超时时间很短。 -
你检查了多个浏览器吗?
-
@V4Vendetta/@maniacneron:我没有使用 webfarm,也没有使用 web garden...我只是检查了 IIS - 网站 - 会话状态 - 正在进行中,cookie 设置 = 使用 cookie,名称 = asp .net_sessionid, time-out = 20 .... 我还在 web.config 中添加了 sesstionstate timeout="20" ...它丢失了。
-
你能贴一些代码吗,希望你在page_load部分没有
Session["basket"] = null这样的东西?
标签: c# asp.net iis iis-7.5 session-variables