• Response.Redirect() 跳转中的ThreadAbortException


    最近写一个login用的handler,发现了一个以往没太注意的问题:

            public void ProcessRequest(HttpContext context)
            {
                
    try
                {
                    
    // Identity authentication
                    if (!AuthenticateIdentity(context))
                    {
                       context.Response.Redirect(Page1);
                    }

                    
    // Check parameters
                    if (!TryCheckParams(context))
                    {
                       context.Response.Redirect(Page2);
                    }

                    
    // Valid login
                       context.Response.Redirect(Page3);
                }
                
    catch (Exception ex)
                {
                    DoSth();
                    context.Response.Redirect(Page4);
                }

            }

         如上,我们常希望满足不同的条件就redirect到不同的page去,以上代码运行起来似乎没什么问题,页面能够正常跳转,但仔细检查error log会发现有很多异常抛出:ThreadAbortException (0): [mscorlib] Thread was being aborted.

         原因就在于Response.Redirect 内部调用了Response.End,而Response.End 方法停止页面的执行,并将该执行变换到应用程序的事件管线中的 Application_EndRequest 事件。 Response.End 后面的代码行将不执行。

         网上提供有解决方案是调用Response.Redirect的重载方法Redirect(string url, bool endResponse)并传入false,阻止对Response.End的调用。但在本实例中,这种方法也不能解决问题,因为我方法里面的逻辑判断是线性的if...if...if...,这就导致Response.Redirect可能被执行多次从而产生异常。要避免此错误,可以使用嵌套语句if...else if...else...,这样可以避免重复执行Redirect,但对于复杂的逻辑,这个嵌套会很复杂,非常不易于阅读。那么怎么办呢?我后来想到整个方法只在最后做Rediret跳转,而在前面所有的条件分支中只设置redirectURL,然后用goto语句强行转移到最后面的跳转语句。这样问题确实解决了,但目前很多公司都不建议使用goto语句,认为它会造成程序逻辑的混乱,不易于阅读和维护。

         其实最佳方案是将以上代码提取到一个单独的方法HandleRequest(),这个方法执行所有的逻辑并返回最终的redirectURL,而ProcessRequest方法调用HandleRequest获取redirectURL并执行跳转即可。

    参考:http://www.cnblogs.com/rolinson/archive/2005/01/22/95710.html

  • 相关阅读:
    在HTML中使用JavaScript
    小强的HTML5移动开发之路(49)——HTML5开发神器HBuilder
    小强的HTML5移动开发之路(48)——(小练习)新闻订阅系统【1】
    QT学习记录之控件布局
    QT学习记录之理解信号槽机制
    小强的HTML5移动开发之路(47)——jquery mobile基本的页面框架
    Linux下MySQL备份以及crontab定时备份
    Linux管理日记(三)
    小强的HTML5移动开发之路(46)——汇率计算器【2】
    kindeditor实现ctrl+v粘贴word图片并上传
  • 原文地址:https://www.cnblogs.com/chyspace/p/1961342.html
Copyright © 2020-2023  润新知