【问题标题】:session variables lost for some reason会话变量由于某种原因丢失
【发布时间】: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.5IIS7.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


【解决方案1】:

你只是丢失了那个特定的变量吗? - 如果是这样,那么可能是您的代码的某些部分正在执行此操作。

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

【讨论】:

  • 我没有使用 webfarm,也没有使用 web garden...我刚刚检查了 IIS - 网站 - 会话状态 - 正在进行中,cookie 设置 = 使用 cookie,名称 = asp.net_sessionid,超时= 20.... 我在哪里可以看到日志:我查看了 eventviewer - administratrive events -> 在这里找不到信息... 我需要在哪里检查?哪个日志?
  • 我只是想知道,代码中的什么可能导致它?我目前有同样的问题,但只有一些变量会丢失。我从不重新分配变量内部的值,但我确实经常使用该变量。
【解决方案2】:

【讨论】:

  • 是的,但大多数问题都很常见
【解决方案3】:

梅苏特:

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

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

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

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

  • Cookie

  • 缓存

  • 网址参数

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

【讨论】:

  • 用户选择项目并在回发中捕获所选项目并作为列表放入会话中,以在回发后保留值:我放入会话中是因为我需要另一个页面中的值....但会话变量在同一页面中丢失了
  • 你没有提到 SQL 状态,这是我的首选方法。
  • @James McCormack -- 是的,完全正确。
【解决方案4】:

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

最好的方法是使用基于服务器的会话状态,在这种情况下你可以忘记这些问题。见HOW TO: Configure SQL Server to Store ASP.NET Session State

【讨论】:

  • @mesut:您是否在 Application_Error() 级别遇到任何错误?
  • 这是 dotnetnuke CMS 系统...我想我没有 application_error - 但我会尝试 protected override void OnError(EventArgs e) { base.OnError(e); lblMessage.Text = e.ToString(); }
  • 我尝试应用 sql Server 会话状态:我得到“无法使用 SQL Server,因为 SQL Server 上没有安装 ASP.NET 2.0 版会话状态。请安装 ASP.NET 会话状态 SQL Server版本 2.0 或更高版本。“我检查了我的数据库,我看到创建了必要的表,例如 aspnet_XXXX 等。可能是什么问题?
  • 你应该让管理员安装它
【解决方案5】:

听起来您的 appdomain 正在被回收。您的 web.config compilation 元素是否设置为 debug 模式?在调试模式下,ASP.NET 每进行 15 次动态编译就会重置 appdomain。发生这种情况时,如果您的会话存储在内存中(InProc 模式 - 默认),它们将会丢失。

仅供参考,只要您的网站上发生文件更改(例如您编辑 ASPX 文件、正在生成的图像或 web.config 更改),就会发生动态编译。

因此,要么将站点置于发布模式 (&lt;compilation debug="false" ... /&gt;),要么将 numRecompilesBeforeAppRestart 的值从 web.config 中的 15 增加,或者使用非易失性会话存储模式 - 例如SQL 会话状态。

【讨论】:

  • 好的,让我试试 Release 模式.... 但我在 web.config 中找不到 numberOfCompilations 这个词。
  • 对不起,应该是numRecompilesBeforeAppRestart。请参阅此处了解更多信息:msdn.microsoft.com/en-us/library/s10awwz0.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多