0

好的,经过一番摆弄,我终于确定了我一直遇到的问题。

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

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

现在这工作正常, 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 寿命为 1 个月,会话超时设置为 30 分钟。

会话状态设置是sql server,

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

Server=tcp:90210.database.windows.net,1433;Database=USState;用户 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]);
        }
4

2 回答 2

1

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

于 2013-08-20T17:23:07.533 回答
0

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

更多信息在这里 - ASP.net:动态加载 Web 用户控件

于 2013-08-20T18:35:18.483 回答