ASP.NET验证错误导致后续请求处理时间过长

ASP.NET Validation error causes subsequent requests to take a long time to be processed

我们通常有第 3 方记录器 NLog 来捕获应用程序错误,但它没有捕获这些错误。唯一可以查看错误详细信息的地方是在 Windows 事件查看器中,这些将显示为 warnings.The 错误似乎是 asp:Timer 控件触发回传的结果

事件查看器中记录的错误消息:

我们网页表单页面中的计时器:

      <asp:UpdatePanel ID="uPnlMsgMngmt" runat="server">  
        <ContentTemplate> 
            <asp:Timer ID="tmMsgMngmt" runat="server" OnTick="tmMsgMngmt_Tick" Interval="10000"></asp:Timer>

从tmMsgMngmt_Tick

调用的代码绑定数据
        //List of all areas
        List<MessageAllArea> lstAreaStatus = messageArears.GetAreaStatus();
        Session.Add("AllArea", lstAreaStatus);
        //List of affected areas
        List<MessageAllArea> lstAffectedArea = messageArears.GetAffectedArea();
        Session.Add("AfectedArea", lstAffectedArea);
        //List of affected areas
        List<MessageAllArea> lstLdshedding = messageArears.GetLoadShedding();
        Session.Add("LoadShdArea", lstLdshedding);

        ltvData.DataSource = lstAreaStatus;
        ltvData.DataBind();
        //Populate Area drop down list
        ddlLoadMessages.Items.Clear();
        if (lstAreaStatus.Count > 0)
        {
            foreach (MessageAllArea item in lstAreaStatus)
            {
                int attNo = int.Parse(item.attnFlag);
                if (attNo == 1)
                {
                    ddlLoadMessages.Items.Add(new ListItem(item.Area, item.AreaId));
                }
            }
        }
    }

当遇到这个错误时,IIS 似乎挂起。它只会间歇性地发生在我们的用户身上,我们一直无法在我们的开发环境中重现它。来自同一用户的后续页面请求可能需要长达 20 分钟的时间才能得到处理。

所以出现这个错误的原因是下拉列表控件ddlLoadMessages被asp:Timer的tick事件修改,ddlLoadMessages控件不在相关的UpdatePanel中。这使得 .NET 验证引擎不知道下拉列表的更改来自何处,从而导致错误。

不过,我还不能确定为什么这会导致后续页面加载时间更长。

编辑 - 这似乎不是页面加载时间过长问题的真正根源。每当遇到任何未处理的异常时,我们的网站似乎仍然挂起。

编辑 2 - 终于找到了问题的真正根源,我们使用的是旧版本的 .NET Framework 4.5,它有一个错误,某些请求会意外地冻结在 RequestAcquireState,请参阅:

ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress

安装最新的 .NET 4.5 Framework 解决了这个问题。