【问题标题】:Server session still alive, but data being lost服务器会话仍然存在,但数据丢失
【发布时间】:2013-08-20 17:04:42
【问题描述】:

好的,经过一番折腾,我终于发现了我一直遇到的问题。

我有一个网站,在初始化时会初始化不同的对象并用数据填充它们。这包括不同页面上的数据集和自定义控制器。这个问题似乎在所有页面上都不一致地影响我的网站。

我将解决我最详细的错误。我有一个评论页面,人们可以在其中动态创建评论框和一个填充数据的下拉列表。在初始加载时,仅创建一个评论框。当您单击一个按钮时,会发生回发,另一个按钮将加载到包含所有评论框的列表中,并显示附加评论框。

现在这工作正常,ispostback = true 并且列表的计数加一。这一切都托管在 iis 下的 windows 2012 服务器上。该网站通过 sql server 设置会话,会话限制为 20 分钟。该网站还使用持续一个月的 cookie 来包含一些元数据。现在,如果我等待 5 分钟左右(我在网页上保持不活动状态),然后再次点击按钮,有时会发生加载需要一段时间,ispostback 将是真的,它会进入 addbuttonclick方法并开始将下一个评论框添加到列表中,它会将评论框的先前数据加载到新的评论框,这就是它会出错的地方。评论控制列表不知何故被清除了,我收到错误时的计数为 1。这意味着服务器...随机清除了评论列表。

类似的问题也困扰着我的其他页面,尽管更多的数据集被清除。任何帮助将不胜感激。

页面加载初始化

  if (!IsPostBack)
        {                    
                DataSet BudgetCodes = new DataSet();
                BudgetCodes = WFlowWS.GetBudgetCodes();
                commentControl.Clear();
                //intialize comment control            
                this.CommentControl1.Ds = BudgetCodes;
                this.CommentControl1.FillBudgetCode(this.CommentControl1.Ds);
                if (commentControl.Count == 0)
                {
                    commentControl.Add(this.CommentControl1);
                }
            }

btnaddadditionalComment 点击

    protected void btnAddAdditionalCom_Click(object sender, EventArgs e)
{
    try
    {
        try
        {
            commentControl.Add(LoadControl("~/WorkflowCommentControl.ascx") as WorkflowCommentControl);
        }
        catch (Exception exl)
        {
            Response.Write(exl.ToString() + "line 1");
            Response.End();
        }
        try
        {
            Response.Write("ISPOSTBACK " + IsPostBack.ToString() + "   COMMENT CONTROL COUNT : " + commentControl.Count().ToString() + "     ");
            commentControl[commentControl.Count() - 1].Ds = commentControl[(commentControl.Count() - 2)].Ds;
        }
        catch (Exception exl)
        {
            Response.Write(exl.ToString() + "line 2");
            Response.End();
        }
        try
        {
            commentControl[commentControl.Count() - 1].FillBudgetCode(commentControl[commentControl.Count() - 2].Ds);
        }
        catch (Exception exl)
        {
            Response.Write(exl.ToString() + "line 3");
            Response.End();
        }
        try
        {
            this.PanelComment.Controls.Add(new LiteralControl("<br/>"));
        }
        catch (Exception exl)
        {
            Response.Write(exl.ToString() + "line 4");
            Response.End();
        }
        try
        {
            this.PanelComment.Controls.Add(commentControl[commentControl.Count() - 1]);
        }
        catch (Exception exl)
        {
            Response.Write(exl.ToString() + "line 5");
            Response.End();
        }
    }
    catch (Exception exl)
    {
        Response.Write(exl.ToString() + "line 6");
        Response.End();
    }
}

cookie 寿命为一个月,会话超时设置为 30 分钟。

会话状态设置为sql server,

连接字符串在下面(稍作修改)

Server=tcp:90210.database.windows.net,1433;Database=USState;User ID=Pirates;Password=Boats;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;

超时30秒,连接重试间隔0,勾选启用自定义数据库。

Cookie 设置 模式:使用 Cookie 名称:ASP.NET_SessionId 超时:20

检查使用主机身份进行模拟

应用程序池的基本 IIS 设置是

.Net Framework v4.0.30319 托管管道模式:集成 立即启动应用程序池被选中

页面加载结束时加载每个评论控件的代码

for (int x = 1; x < commentControl.Count; x++)
        {
            this.PanelComment.Controls.Add(new LiteralControl("<br/>"));
            this.PanelComment.Controls.Add(commentControl[x]);
        }

【问题讨论】:

  • 向我们展示背后的代码。
  • 代码值一百万字。仅代码和错误。
  • 已编辑以包含注释控件初始化的代码以及单击 btn 添加附加注释时会发生什么
  • 全局错误处理程序 (global.asax / Application_Error) 中是否捕获了任何内容?我有一个类似的问题,结果是一个抛出的异常使会话无效,但仅适用于某些浏览器。
  • 在 btnAdditionalCom_Click 中捕获了实际抛出的错误(不一致),特别是第 2 行。

标签: c# .net iis postback


【解决方案1】:

听起来您的会话超时变量可能太低了。由于内存使用或其他问题,您的应用程序池也可能正在回收;您能告诉我们您在该应用程序池上的 IIS 设置以供回收吗?

【讨论】:

  • @IvanS 你的应用程序池回收似乎是可疑的。你能检查一下这些设置,看看它们是否看起来很低吗?如果您使用的是 IIS7+,则可以在日志中添加一个事件,以便查看:blogs.iis.net/ganekar/archive/2008/12/12/…
  • 应用程序池的回收设置只有以分钟为单位检查的固定时间间隔,时间为 1740。
  • 还将应用程序池回收设置为事件,似乎没有被事件查看器记录
【解决方案2】:

如果您将 UserControls 动态添加到网页,则需要在每次页面加载时执行此操作。它会忘记(或者更准确地说,永远不知道)页面的先前状态。

更多信息在这里 - ASP.net: dynamically load web user control

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2010-12-29
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多