何时可以安全地执行Response.Redirect()而不抛出异常?

时间:2010-03-29 17:27:43

标签: c# asp.net response.redirect

我有一个中间类,为我需要身份验证的所有页面扩展System.Web.UI.Page。该课程主要进行自定义身份验证处理。

当访问权限不足的用户尝试访问某个页面时,我会尝试将用户重定向回登录页面,同时阻止执行任何其他页面事件(即Page_load)。想到的第一个解决方案是Response.Redirect的默认实现。当然,这样做的缺点是抛出ThreadAbortExceptions的可能性。

所以我的问题是这样的:在页面生命周期中(如果有的话)实际上安全地执行Response.Redirect()而没有抛出ThreadAbortException?

public class CustomPage : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        if (!IsValid())
            Response.Redirect("login.aspx", true);
    }
}

3 个答案:

答案 0 :(得分:5)

如果您将true作为第二个参数传递,它永远不会“安全” - 它将始终抛出异常。在内部,Response.Redirect()调用Response.End(),直接中止当前线程。

在没有抛出异常的情况下截断HttpRequest的唯一“安全”方法是使用HttpApplication.CompleteRequest(),但这会导致当前请求中的代码执行进一步发生。

答案 1 :(得分:1)

好奇,你为什么要自己这样做?如果有的话,你应该使用其中一个身份验证提供程序(最终,可以自定义FormsAuthentication来处理几乎你能想到的任何场景)。

然后,您可以使用web.config文件中的authorization element来指示匿名用户无法访问哪些页面/目录。 ASP.NET将负责其余工作,将用户重定向到您指定的登录页面,以及在用户登录时重定向。

答案 2 :(得分:0)

如果您不想要ThreadAbort异常,则应将False传递给endResponse参数。当然这意味着你必须处理页面的其余部分,这很难做到。

除非你做了像锁定一样非常愚蠢的事情,否则在ASP.NET页面中抛出ThreadAbort异常是完全安全的。

另一种选择是使用Server.Transfer。这比重定向具有更好的性能,但它也使用ThreadAbort异常。