Response.redirect引发“Thread was being aborted”错误。

61

我有一段VB.NET代码,用于在需要从数据库中删除对象时调用。 在Page_load函数中,我检查它是否没有被post back(以防手动刷新),并且在删除对象后,使用Response.redirect重定向到调用者页面。 此时我的代码会引发异常:

异常情况:在File_delete.aspx.vb文件第34行发生 错误:线程正在中止。

而且,在事件查看器中我可以看到aspnet_wp.exe崩溃:

aspnet_wp.exe (PID: 1532) 发生意外停止。

有关更多信息,请参见帮助和支持中心,网址为 http://go.microsoft.com/fwlink/events.asp

不清楚为什么只有在这里使用response.redirect时才会发生这种情况,因为我也用它来查看文件,而不仅仅是删除它。


与 https://dev59.com/W3M_5IYBdhLWcg3wThR3 相似的重复问题已经关闭。 - The King
5个回答

151
默认情况下,Response.Redirect() 会中止当前线程。这自然会引发 ThreadAbortException。可以通过向 Response.Redirect() 传递 false 来防止此情况发生,这样就不会中止当前线程。
Response.Redirect(url,false) 

然而,请注意这意味着什么。如果线程没有被中止,那么在Response.Redirect()之后的代码将继续执行。请相应地控制您的逻辑流程。(通常使用return语句和其他跳转指令来跟随重定向操作。)

Response.Redirect(url,false) 
Return

我的方法有async关键字,因此出现了异常。 - Lucas Riechelmann Ramos

23
根据MSDN文档,如果不给HttpRequest.Redirect(string, bool)方法的endResponse参数传递一个false布尔值,Response.Redirect将会始终引发ThreadAbortException异常。
只需要将endResponse参数设置为false即可。

1
这是推荐的方法,你只需要小心使用,因为在 Response.Redirect 之后的代码将被执行。 - Mike Ohlsen
18
在调用 Response.Redirect(url, false) 后,调用 HttpContext.Current.ApplicationInstance.CompleteRequest() 来终止请求而不引发异常。 - StanleyH
1
但页面生命周期仍在继续,Postback事件被处理,并且HTML被发送到客户端。请参阅http://www.c6software.com/CodeSolutions/dotnet/ThreadAbortException.aspx。 - StanleyH
@StanleyH 是的,在调用 Response.Redirect(url, false) 后,当前页面中的以下代码将被执行,这不是我的目的。如何解决它? - paul cheung
@StanleyH 不会,请求会继续其页面生命周期。 - ActiveX

6

0

Response.Redirect会故意抛出异常,这是正常情况。


为什么会抛出异常?我不理解背后的逻辑。 - Marin

0
这可能发生在您进行异步调用时。 使用Response.Redirect(string url, false),其中string url是重定向URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接