服务器会话仍然存在,但数据丢失

时间:2013-08-20 17:04:42

标签: c# .net iis postback

好的,所以经过一番摆弄后我终于发现了一个我一直存在的问题。

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

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

现在这个工作正常,ispostback = true并且列表的计数加1。这些都托管在iis下的Windows 2012服务器上。该网站通过SQL Server设置为会话,会话限制为20分钟。该网站还使用持续一个月的cookie来包含一些元数据。现在,如果我等待5分钟左右(我在网页上保持不活动状态),并再次按下按钮,有时会发生加载需要一段时间,ispostback将为true,它将进入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设置 模式:使用Cookies 名称: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]);
        }

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

此处有更多信息 - ASP.net: dynamically load web user control