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

LCJ*_*LCJ 10 c# asp.net health-monitoring

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

Response.Redirect ("Salary.aspx");
Run Code Online (Sandbox Code Playgroud)

它工作正常,直到我添加异常处理如下.

try
{
   Response.Redirect ("Salary.aspx");
}
catch(Exception ex)
{
//MyLog();
    throw new Exception();
}

//Remaining code in event handler
Run Code Online (Sandbox Code Playgroud)

这引起了一个新的异常,说"线程正在被中止".我开始知道可以通过将endResponse重定向设置为false 来避免这种情况.

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

陷阱

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

参考

  1. 为什么Response.Redirect导致System.Threading.ThreadAbortException?
  2. ASP.NET异常"线程被中止"导致方法退出

Mik*_*Dev 12

结束响应(Response.Redirect(url)Response.Redirect(url, true))将不会有更好的性能Response.Redirect(url, false).有了false,因为你可以控制代码执行,你可以简单地不是在你打算什么时候将用户重定向的情况下执行任何代码.

这是在指定的MSDN项Response.Redirect():

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

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

该帖子的底线是Response.Redirect()向浏览器返回302.没有为问题,当你使用一个潜在的Response.Redirect(url, false),因为页面继续执行,并且用户可以选择忽略的302,而是看该页面会一直被渲染...所以你需要采取一些措施,以确保它们不会看到你不希望他们看到的任何东西.Firefox 的NoRedirect插件在测试时非常有用.

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