Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由于某种原因,会话变量丢失_C#_Asp.net_Iis_Iis 7.5_Session Variables - Fatal编程技术网

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

C# 由于某种原因,会话变量丢失,c#,asp.net,iis,iis-7.5,session-variables,C#,Asp.net,Iis,Iis 7.5,Session Variables,我试图建立一个电子商店。在我拥有的每个项目旁边都有一个asp:imagebutton单击此imagebutton时,我将检查会话变量是否存在。如果不存在,则我将值添加到列表(实体类)中,并将此列表添加到会话中 如果会话不是空的,那么我将从会话中检索值到列表中并更改列表,然后将列表添加回会话 问题: 由于某种原因,我突然松开了session变量。我查看了我的手表(时间),它是不可预测的,有时不到1分钟,有时3分钟,有时5分钟等等 为什么我要释放session变量 我在谷歌上搜索发现,如果使用Res

我试图建立一个电子商店。在我拥有的每个项目旁边都有一个
asp:imagebutton
单击此imagebutton时,我将检查会话变量是否存在。如果不存在,则我将值添加到列表(实体类)中,并将此列表添加到会话中

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

问题:

由于某种原因,我突然松开了session变量。我查看了我的手表(时间),它是不可预测的,有时不到1分钟,有时3分钟,有时5分钟等等

为什么我要释放session变量

我在谷歌上搜索发现,如果使用
Response.Redirect
-w/o false参数,或者使用
UpdatePanel
等,可能会发生这种情况

我现在正在同一页中释放变量

整个想法都放在一个会话变量中,然后在第二个
aspx
页面中签出并检索会话变量。。。但这并不总是有效的,因为在大多数情况下,会话变量变为空。有时它也能起作用

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

在我的页面中,任何用户(已验证或任何合法用户)换句话说,任何未登录的用户都应该能够订购(我将发送发票以预付款)

我不使用网络农场,也不使用网络花园。。。我刚刚检查了IIS-网站-会话状态-正在进行,cookie设置=使用cookie,name=asp.net_sessionid,超时=20

请给我一些建议

它是
C#
aspx3.5
IIS7.5

我的ASPX页面中没有页面加载

//我唯一放置sessoin=null的地方是一个linkbutton,其余的我不会在session[“basket”]中放置null

protectedvoid lnkDeleteAllSelected\u单击(对象发送方,事件参数e)
{
会话[“篮子”]=null;
重新加载BasketItems();
}
受保护的覆盖无效OnInit(事件参数e)
{
碱基.奥尼特(e);
//System.Diagnostics.Debugger.Break();
lvJuridisch.ItemDataBound+=新事件处理程序(this.lv_ItemDataBound);
lvJuridisch.DataBound+=新事件处理程序(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();
    }
受保护的无效imgButtonAddtoBasket\u单击(对象发送者,图像单击事件参数)
{
ListViewDataItem lvi=((发送者作为ImageButton).NamingContainer)作为ListViewDataItem;
DataKey currentDataKey=(作为ListView的lvi.NamingContainer);
WebShopInfo SingleItem=新建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”)作为HiddenField)。值;
SingleItem.m_price=Convert.ToDecimal((lvi.FindControl(“hiddenField\u m_price”)作为hiddenField.Value);
SingleItem.nm\u price=Convert.ToDecimal((lvi.FindControl(“hiddenField\u nm\u price”)作为hiddenField.Value);
SingleItem.mt_pourc_tva=Convert.ToDecimal((lvi.FindControl(“hfBTW”)as HiddenField).Value);
List lws=新列表();
如果(会话[“篮子”]==null)
{
//会话为空,因此将listview添加到会话。。。。
//Session.Timeout=20;--我尝试了这个,但它不起作用。。。
lws.Add(单个项目);
会话[“篮子”]=lws;
}
其他的
{
//会话不为空,因此从会话获取asp:listview。
lws=会话[“篮子”]作为列表;
WebShopInfo wsi=lws.Where(a=>a.cd\u type\u pub==SingleItem.cd\u type\u 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.移除(wsi);
如果(SingleItem.Count>0)
lws.Add(单个项目);
会话[“篮子”]=lws;
}
重新加载BasketItems();
}

您是否正在丢失特定的变量如果是这样的话,那么可能是代码的某个部分在做这件事


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

您会惊讶地发现会话使用缓存的幕后原因

查看以下内容(您将发现有关会话问题的所有常见问题):

mesut:

老实说,会话内存可能非常随意。如果应用程序宕机,您可以释放它,或者像您所说的,如果用户的会话重新启动,您可以释放它。通常,Asp.Net的选项是将数据存储在:

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

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

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

  • 饼干

  • 缓存

  • Url参数

这些方法中的每一种都在性能、内存或依赖性方面进行权衡
 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();
    }