可以“EndResponse”提高ASP.Net页面的性能

我的员工页面中有一个Response.Redirect 。 它重定向到Salary页面。

 Response.Redirect ("Salary.aspx"); 

它工作正常,直到我添加了如下的exception处理。

 try { Response.Redirect ("Salary.aspx"); } catch(Exception ex) { //MyLog(); throw new Exception(); } //Remaining code in event handler 

这导致了一个新的exception,说“线程被中止”。我发现通过将重定向的endResponse设置为false可以避免这种情况。

 Response.Redirect(url, false); Context.ApplicationInstance.CompleteRequest(); 

新exception的解释:它总是抛出exception但由框架处理。 因为我添加了一个try..catch它被捕到了(我正在抛出一个新的exception)

注意: CompleteRequest确实绕过了其他HTTPfilter和模块,但它不会绕过当前页面生命周期中的其他事件

注意:Response.Redirect将此exception抛出到当前页面的结束处理。 ASP .Net本身处理此exception并调用ResetAbort继续处理。

  1. “将endResponse设置为false”是否可以提高性能,因为不会抛出exception?
  2. “将endResponse设置为false”是否会降低性能,因为页面生命周期事件未终止?

陷阱

  1. 如果将endResponse设置为false ,则将执行eventhandler中的剩余代码。 因此,我们需要对剩余代码进行if检查(检查:是否未满足重定向条件)。

参考

  1. 为什么Response.Redirect导致System.Threading.ThreadAbortException?
  2. ASP.NETexception“线程被中止”导致方法退出

结束响应( Response.Redirect(url)Response.Redirect(url, true)将没有Response.Redirect(url, false)更好的性能。 如果使用false ,由于您可以控制代码执行,因此在您要重定向用户时,您根本无法再执行任何代码。

这在Response.Redirect()的MSDN条目中指定:

如果为endResponse参数指定true,则此方法为原始请求调用End方法,该方法在完成时抛出ThreadAbortExceptionexception。 此exception对Web应用程序性能有不利影响 ,这就是建议为endResponse参数传递false的原因。

正如您所指出的,您需要关注页面生命周期事件。 如果要重定向用户( 不仅仅是为了提高性能 ),则不应继续执行页面事件。 我最近写了一个简短的例子, 说明如果不这样做,编码/规划不好会发生什么 。

该post的底线是Response.Redirect()向浏览器返回302。 自页面执行继续以来Response.Redirect(url, false)使用Response.Redirect(url, false)时可能会出现问题,用户可以选择忽略302而不是看到已经呈现的页面…所以你需要采取措施确保他们看不到任何你不希望他们看到的东西。 Firefox的NoRedirect插件在测试时非常有用。

为获得最佳性能:使用"false"作为endResponse参数,确保您没有运行任何其他代码,并确保页面不会呈现您不希望用户忽略302的任何信息。