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 解决了这个问题。
我们通常有第 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 解决了这个问题。