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

在调用response.end的时候有时会报告“线程正被终止”的异常,下面是微软官方的解决办法

症状

如果使用  Response.EndResponse.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 方法。

状态

这种现象是设计使然。

A.

如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常。异常内容:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值

您可以使用 try-catch 语句捕获此异常。

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);

B.

在调用Response.End()时,会执行Thread.CurrentThread.Abort()操作。

如果将Response.End()放在try...catch中,catch会捕捉Thread.CurrentThread.Abort()产生的异常System.Threading.ThreadAbortException。

解决方法(任选一个):

  1. 在catch中排除ThreadAbortException异常,示例代码如下:

    try{ Response.End();}catch (System.Threading.ThreadAbortException){}catch (Exception ex){ Response.Write(ex);}

  2. 用Context.ApplicationInstance.CompleteRequest()结束当前请求,代码如下:

    protected void Page_Load(object sender, EventArgs e){ try { Response.Write("Hello world!"); this.Page.Visible = false; Context.ApplicationInstance.CompleteRequest(); } catch (Exception ex) { Response.Write(ex); }


你可能感兴趣的:(.net)