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   将缓冲输出。    

历史博文

标签:
六月 29, 2008 at 7:39 下午 by yippee 1,028 次
Category: Info
Tags: