try catch中用了 Response.Redirect 引发的线程异常终止

记录一下,提醒自己。

今天写代码的时候,在try 中写了一句  Response.Redirect

在 catch 把页面重定向到了另外一个地方

本来是想打算,如果没出现异常,就定到页面A,如果异常了就定到页面b,然后发现,尼玛怎么样都去了页面b

本来以为是我try代码块中,访问webService出现了什么异常,单步调试了好久,每次都正常没有错误,但是一到 Response.Redirect  就线程终止

搜了一下资料,解决了。以下是一篇说明。很多地方有,不知道出处了。

如果使用 try 、catch 处理包含Response.Redirect  语句代码,总是能捕捉到异常:线程正在中止,
其实不仅仅Response.Redirect 会,Response.End 和 Server.Transfer 也是一样的情况,本质的原因的原因是Response.End 方法停止页的执行,并将该执行变换到应用程序的事件管线中的 Application_EndRequest 事件, Response.End 后面的代码行将不执行。通常认为Response.End 方法是线程的非正常结束,因此MS就在内部抛出ThreadAbortException 异常,而Response.Redirect 和 Server.Transfer 这两种方法都在内部调用 Response.End。

症状

如果使用 Response.EndResponse.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常。您可以使用 try-catch 语句捕获此异常。

原因

<!-- Inject Script Filtered -->

Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件。不执行 Response.End 后面的代码行。

此问题出现在 Response.Redirect 和 Server.Transfer 方法中,因为这两种方法均在内部调用 Response.End

解决方案

要解决此问题,请使用下列方法之一:

  对于 Response.End,调用 HttpContext.Current.ApplicationInstance.CompleteRequest 方法而不是 Response.End 以跳过 Application_EndRequest 事件的代码执行。
  对于 Response.Redirect,请使用重载 Response.Redirect(String url, bool endResponse),该重载对 endResponse 参数传递 false 以取消对 Response.End 的内部调用。例如:

  Response.Redirect ("nextpage.aspx", false);
            

如果使用此替代方法,将执行 Response.Redirect 后面的代码。

    对于 Server.Transfer,请改用 Server.Execute 方法。
时间: 2024-10-06 20:40:30

try catch中用了 Response.Redirect 引发的线程异常终止的相关文章

Response.Redirect引起的性能问题分析

现象: 最近做的一个系统通过单点登录(SSO) 技术验证用户登录.用户在SSO 系统上通过验证后,跳转到该系统的不同模块.而跳转的时间一直维持子啊几分钟左右. 分析步骤: 在问题复现时抓取Hang dump 进行分析: 1) 找到用户登陆的调用堆栈 0:071> kb RetAddr           : Args to Child                                                           : Call Site 000007fe`f8

Server Transfer()和Response.Redirect()的使用

一.Server Transfer() Server.Transfer:对于当前请求,终止当前页的执行,并使用指定的页url路径来开始执行一个新页. 1. Server.Transfer只能够转跳到本地虚拟目录指定的页面,而Response.Redirect则十分灵活: 2. Server.Transfer可以将页面参数方便传递到指定页面: 3. 使用时,Server.Transfer跳到别的页面后,浏览器显示的地址不会改变,有时反而会造成误会,当然也有些场合需要这样的效果: 4. Server

1. Server.Transfer和Response.Redirect

今天在使用ServerTransfer和Response.Redirect定位到当前页面来实现刷新页面时,发现了一些现象: 1.使用Response.Redirect刷新本页面,造成当前页面显示的数据消失的情况: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { String Path; string connString = "server=.;database=ComInfo;integrate

Response.End()、Response.Redirect()、Server.Transfer()导致“正在中止线程”异常的问题

try {     if (true)           {                Response.Write("测试1");                Response.End();            }    else            { if (true)                {                     Response.Write("测试2");                     Response.E

Server.Transfer和Response.Redirect区别

根本上,Response是叫浏览器去重新转向到指定的网页,而Server自然是发生在服务器端为主了,因此会有以下区别: 1. Server.Transfer只能够转跳到本地虚拟目录指定的页面,而Response.Redirect则十分灵活:2. Server.Transfer可以将页面参数方便传递到指定页面:3. 使用时,Server.Transfer跳到别的页面后,浏览器显示的地址不会改变,有时反而会造成误会,当然也有些场合需要这样的效果:4. Server.Transfer可以减少客户端对服

Response.Redirect()和Response.RedirectPermanent()区别

在ASP.NET4.0之前,开发人员经常使用Response.Redirect()方法,用编程的手法,将对老的URL的请求转到新的URL上. 但许多开发人员没有意识到的是,Response.Redirect()方法发的是个 HTTP 302 Found (临时转向) 回复,会在用户尝试访问 老的URL时,导致多余的HTTP往返.搜索引擎一般不会跟随多个重新转向跳转,意味着使用一个临时转向会负面影响你的网页排名. 随着ASP.NET的发展,在ASP.NET 4中引进了一个新的Response.Re

Response.Redirect 打开新窗体的两种方法

普通情况下,Response.Redirect 方法是在server端进行转向,因此,除非使用 Response.Write("<script>window.location='http://dotnet.aspx.cc';</script>") 方法外,是不能在新窗体打开所指定的  URL 地址的.可是,假设细致分析一下,假设设置 form 元素的 target 属性,还是有办法打开新窗体的.以下就是能够採用的两种方法. 方法一:在server端设置 targ

大三在校生的传智120天的1200小时.net(十三)关于Response.Redirect和Server.Execute的区别

Server.Transfer("path")内部重定向请求,是服务器内部的接管,浏览器无法意识到这个接管的发生,浏览器地址栏也不会发生变化.而Response.Redirect("")这是经历了一个通知浏览器重定向,浏览器found之后,向服务器发请求重新访问新的url地址并返回给客户端的过程,这是一次http 302请求. 内部接管,再被重定向到页面中时可以访问到Request,Cookies等,这些来源页面接收的参数的,就像这些参数是传递给他的.而Respon

ASP.NET Response.Redirect 丢失 Session的问题

以前在做ASP.NET开发时一直没注意到一个问题,就是广泛使用的Response.Redirect方法并不会将服务器端在Response中新增或修改的Cookie返回给客户端浏览器,而网站的Session一般来说又是通过Cookie来做客户端唯一标识的,这就会使得当浏览器第一次通过Get方法发送请求到服务器后(由于是客户端浏览器第一次访问服务器,所以这时客户端浏览器中还没有Cookie存储SessionID),在服务器返回的响应中得不到带有SessionID的Cookie,使得浏览器在下一次发送