我很确定错误的原因是因为表单身份验证“ticket”已过期。当用户在过去20分钟内没有完成任何页面请求并单击任何GridView链接(进行编辑,删除,排序......)时,会引发异常: Sys.WebForms.PageRequestManagerServerErrorException 12031。
当GridView位于 UpdatePanel 中时,引发仅例外。
如果我删除UpdatePanel,应用程序会将用户重定向到登录页面,这应该是预期的行为。
如何才能捕获此异常,以便将用户重定向到登录页面?
注意:已经存在关于同一错误的问题:Sys.WebForms.PageRequestManagerServerErrorException 12031。但是,原因是不同的,因为它与存储在ViewState中的对象的大小有关,这不是我的情况。
答案 0 :(得分:1)
添加Global.asax(如果没有)。
protected void Application_Error(object sender, EventArgs e)
{
// Get the last exception
Exception ex = Server.GetLastError();
...
如果异常是PageRequestManagerServerErrorException
Server.ClearError();
Response.Redirect("~/login");
答案 1 :(得分:0)
服务器端,您可以从UpdatePanel的AsyncPostBackError事件处理此异常。这将允许您举例来记录错误。
要重定向,您需要处理异常客户端以自定义错误处理(并在您的情况下重定向到登录)。
这两个都记录在这里:http://msdn.microsoft.com/en-us/library/bb398934.aspx
答案 2 :(得分:0)
如果您收到异常浏览器的响应,则可以通过连接ScriptManager的endRequest事件并检查是否存在错误和正确的httpStatusCode来捕获它。只需确保在asp:ScriptManager标记下添加javascript,以便浏览器识别命名空间。
如果您需要进一步扩展,请查看MSDN documentation
<script type="text/javascript" language="javascript">
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args)
{
// Verify the httpStatusCode you are receiving
if (args.get_error() != undefined && args.get_error().httpStatusCode == '302')
{
args.set_errorHandled(true);
alert('Authentication expired, redirecting to login page');
location.href='login.aspx'; // Whatever your login page is
}
}
</script>
答案 3 :(得分:0)
我不知道为什么会这样,但是当它发生时,我只是将错误标记为已处理并且没有任何事情发生。只需添加以下JavaScript,您的麻烦就会消失。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<script type="text/javascript" >
(function() {
var prm = Sys.WebForms.PageRequestManager.getInstance();
if (prm)
{
prm.add_endRequest(
function (sender, args) {
// Any code you want here
if(args.get_error() && args.get_error().name === 'Sys.WebForms.PageRequestManagerServerErrorException')
{
args.set_errorHandled(args._error.httpStatusCode == 0);
}
});
}
})();
</script>
</form>
</body>
</html>