如何使用UpdatePanel处理因过期身份验证票据而导致的异常?

时间:2011-09-29 13:13:42

标签: c# asp.net exception forms-authentication

我很确定错误的原因是因为表单身份验证“ticket”已过期。当用户在过去20分钟内没有完成任何页面请求并单击任何GridView链接(进行编辑,删除,排序......)时,会引发异常: Sys.WebForms.PageRequestManagerServerErrorException 12031。

当GridView位于 UpdatePanel 中时,引发例外。

如果我删除UpdatePanel,应用程序会将用户重定向到登录页面,这应该是预期的行为。

如何才能捕获此异常,以便将用户重定向到登录页面?

注意:已经存在关于同一错误的问题:Sys.WebForms.PageRequestManagerServerErrorException 12031。但是,原因是不同的,因为它与存储在ViewState中的对象的大小有关,这不是我的情况。

4 个答案:

答案 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>