20071009 Response ThreadAbortException
http://www.yippeesoft.com
Response.redirect和Response.End出现线程中止异常的处理
2005年08月06日 星期六 16:56
在调用response.end的时候有时会报告“线程正被终止”的异常,以下是微软官方的解决办法
症状
如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,则出现 ThreadAbortException 异常。 可使用 try-catch 语句捕捉此异常。
原因
Response.End 方法停止页的执行,并将该执行变换到应用程序的事件管线中的 Application_EndRequest 事件。 Response.End 后面的代码行将不执行。
此问题出现在 Response.Redirect 和 Server.Transfer 方法中,这是由于这两种方法都在内部调用 Response.End。
解决方案
若要解决此问题,请使用下列方法之一:
* 对于 Response.End,调用 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 方法。
状态
这种现象是设计使然。
由於使用 Response.End() 會觸發 System.Threading.ThreadAbortException 例外.
根據微軟文件建議改成 ApplicationInstance.CompleteRequest()
但改了之後, 發現 ApplicationInstance.CompleteRequest() 並不會中止 HTML RESPONSE
它仍繼續完整的把設計階段的網頁畫面送出.
即使我強制在它後面用 return 把程式結束掉, 它仍會繼續處理?
請問要如何解決呢?
目前您的問題的最佳解決方案仍是使用 Response.End(),
並利用 try… catch… 來決定如何處理 System.Threading.ThreadAbortException。
這個問題我從 1.x 一直注意到現在,甚至與微軟的專家們討論過,目前尚無更恰當的解決方案。
其中 ApplicationInstance.CompleteRequest() 的方式是無法解決您的問題的。
原來呼叫 Response.End() 就會丟出 ThreadAbortException.
害我以為是我程序出現錯誤了呢…
請 Google 幫忙一下,原來也有人碰到同樣情況:
Impersonation Failure : ASP.NET – ThreadAbortException
其實還不只是 Response.End(), Server.Transfer() 與 Response.Redirect() 也有機會發生此狀況,因為他們內部也呼叫了 Response.End().
比較正確的作法應該還是先呼叫
Response.Flush();
Response.Close();
會比較好些.
這是那篇文章所提供的參考資料:
* http://support.microsoft.com/default.aspx?scid=kb;en-us;q312629
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpresponseclassredirecttopic2.asp
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpresponseclassendtopic.asp
症状
如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,则出现 ThreadAbortException 异常。 可使用 try-catch 语句捕捉此异常。
原因
Response.End 方法停止页的执行,并将该执行变换到应用程序的事件管线中的 Application_EndRequest 事件。 Response.End 后面的代码行将不执行。
此问题出现在 Response.Redirect 和 Server.Transfer 方法中,这是由于这两种方法都在内部调用 Response.End。
解决方案
若要解决此问题,请使用下列方法之一:
* 对于 Response.End,调用 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 方法。
状态
这种现象是设计使然。
这篇文章中的信息适用于:
* Microsoft ASP .NET(包含在 .NET 框架中)
最近更新: 2002-1-17 (1.0)
关键字 kbDSupport kberror kbExceptHandling kbGrpDSASP kbprb kbWebForms KB312629
ASP教程:ASP内建对象Response
与 Request 是获取客户端 HTTP 信息相反 ,Response 对象是用来控制发送给用户的信息,包括直接发送信息给浏览器、重定向浏览器到另一个 URL 或设置 cookie 的值。
语法
Response.collection&line;property&line;method
一、属性
二、方法
1、Clear
可以用 Clear 方法清除缓冲区中的所有 HTML 输出。但 Clear 方法只清除响应正文而不清除响应标题。可以用该方法处理错误情况。但是如果没有将 Response.Buffer 设置为 TRUE,则该方法将导致运行时错误。
2、End
End 方法使 Web 服务器停止处理脚本并返回当前结果。文件中剩余的内容将不被处理。如果 Response.Buffer 已设置为 TRUE,则调用 Response.End 将缓冲输出。
历史博文
- 20081028 c# BackgroundWorker - 2009
- 20070125 Comodo Firewall pcaudit 2 DLL injection - 2007
- 0303 dos 控制台 beginthreadex waveinout - 2006
- TortoiseCVS User's Guide翻译2TCVS简介3从何开始 - 2005
- SGIP和CMPP的差别消息头格式认证格式 - 2005
- 来自不同的GOOGLE访问 - 2005
- MAGIC C++ PRO*C编程失败的尝试2 - 2005