最近写一个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

转载于:https://www.cnblogs.com/chyspace/archive/2011/02/22/1961342.html

Response.Redirect() 跳转中的ThreadAbortException相关推荐

  1. Response.Redirect引起System.Threading.ThreadAbortException

    最近在测试一个网站时,在切换标签比较频繁的时候,经常会出现假死的状态,一般要等10秒才能反映过来. 最后通过抓取dump文件,发现Response.Redirect(url) 引起System.Thr ...

  2. ASP.NET中Response.Redirect()方法深度剖析

    本文中,我们将借助http分析工具Fiddler,来对Response.Redirect()方法的整个流程进行剖析 首先在Visual Studio中新建一个网站,在Default页面的Page_Lo ...

  3. 在Updatepanel中使用Response.Redirect

    在Updatepanel中使用Response.Redirect 在web.config的<httpModules>节点中加入中加入以下内容即可实现Updatepanel下使用Respon ...

  4. 拦截Response.Redirect的跳转并转换为Js的跳转

    有一个很常见的需求,某个页面需要用户登录才能访问,或者某个操作需要用户登录 这就需要检测用户登录,一般是使用Ajax去检测是否登录,当用户未登录时跳转到登录页面 那么问题来了···· 有的时候我们跳转 ...

  5. 在AJAX中可以使用的Response.Redirect 的冲突解决办法

    <!--在AJAX中可以使用的Response.Redirect 的方便--> 在web.config文件的<system.web>块中增加以下内容,即可解决在ajax中使用  ...

  6. Response.Redirect(string url)报错:System.Threading.ThreadAbortException: 正在中止线程。

    今天用Response.Redirect(string url)重定向时,生产环境总是报ThreadAbortException异常,而调试时没问题.在网上查了很久,都是一样的解决方案,写的貌似很详细 ...

  7. Response.Redirect(x.aspx);跳转后session为null的解决方法

    通常我们做登陆的时候都是登录成功后为管理员保存一些信息,一般都会写类似下面的代码 if(登录成功) { Session["xx"] = "user";  Res ...

  8. asp.net 在使用Response.Redirect try{}catch{}块失效

    try { - Response.Redirect("/mymaimai.aspx"); - } catch (Exception e) { // 异常处理 } 使用以上语句,不管 ...

  9. 关于Response.redirect和Response.End出现线程中止异常的处理

    前段时间做的项目在部署到应用服务器上之后,有很多用户IE会出现.NET的"大红界面",查看Log日志,上面写到: 2003-9-28 17:27:51 481  线程正被中止. 2 ...

最新文章

  1. RollingFileAppender
  2. git cherry-pick 使用指南
  3. mysql工_mysql
  4. google mock分享
  5. ubuntu运行navicat没有反应的解决方法
  6. .NET Standard@Xamarin.Forms
  7. Android 亮屏速度分析
  8. Go语言获取文件的文件路径、文件名、扩展名
  9. 央视报道:荣耀智慧屏或搭载华为鸿蒙系统
  10. sql server 2012 镜像和出现的问题
  11. 根据我4年Facebook营销经验,和大家聊聊做不好Facebook广告的原因!
  12. Java面试--Structs
  13. 惠普触控板使用指南_hp触摸板开关怎么使用 如何锁定hp触摸板
  14. 计算机表格里的隐藏怎么弄出来怎么办,电脑屏幕的excel表格最后一行看不到怎么办《excel表隐藏的表格怎么展开》...
  15. MATLAB音频数字水印算法实现
  16. HTML5视频标签 video 的 poster 属性
  17. [转]Android 开源项目分类汇总
  18. python综合实验心得体会_综合实验心得体会
  19. ssh备考-05Struts2 Action类下的重要API(原生Servlet的API、跳转配置、框架自身的数据封装、自定义拦截器)
  20. 真正的成功,是一群人一起成事

热门文章

  1. 【深度学习模型的训练与评估】一个实例:Iris多分类
  2. 【深度学习入门到精通系列】关于梯度下降和反向传播的探索
  3. K-Means原理解析
  4. ad放置网络标号_PCB工程师必备:AD常用快捷键总结,超级实用
  5. ipconfig不是内部或外部_OSPF外部路由详解-LSA4-LSA5
  6. vue-loader 源码分析
  7. 浅析企业网站排名低可能是哪些原因导致的呢?
  8. 手机移动端网站建设这些细节问题需重视
  9. 判断数组中某个元素除自身外是否和其他数据不同_布隆过滤器,我也是个处理过 10 亿数据的人...
  10. 为什么long和int都是4字节