c# - session 变量由于某种原因丢失

标签 c# asp.net iis iis-7.5 session-variables

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

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

问题:

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

为什么我要松开 session 变量?

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

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

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

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

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

我没有使用网络农场,也没有使用网络花园...我只是检查了 IIS - 网站 - session 状态 - 它正在处理中,cookie 设置 = 使用 cookie,名称 = asp.net_sessionid,超时 = 20。 ...

请指教?

C#ASPX 3.5IIS7.5

我的 ASPX 页面中没有 PAGE_LOAD。

//我唯一放置 sessoin=null 的地方是一个链接按钮,其余的我没有在 session["basket"] 中放置 null...

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();
    }

最佳答案

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

仅供引用,每当您的站点上发生文件更改时,都会发生动态编译,例如您编辑 ASPX 文件、正在生成的图像或 web.config 更改。

因此要么将网站置于 Release模式(<compilation debug="false" ... />),要么增加 numRecompilesBeforeAppRestart web.config 中 15 的值,或使用非 volatile session 存储模式 - 例如SQL session 状态。

关于c# - session 变量由于某种原因丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6814858/

相关文章:

c# - ASP.NET 中的 GridView 不显示有或没有数据

c# - 单击按钮时如何检查下拉索引是否已更改?

c# - 找不到类型或命名空间名称 'type/namespace'.. - Asp.Net - C#

asp.net - ASP.NET 未处理文件夹请求

iis - 默认文档不存在

c# - 为什么从另一个线程更新控件的某些属性是安全的?

c# - 如何备份更新的源代码文件

c# - 请求的操作超时已过期

c# - 如何防止上传 Warez。 (asp.net, C#)

asp.net - SQL Azure 不支持 SqlCacheDependency?有什么替代品吗