"EndResponse"能提高ASP.Net页面的性能吗?

10

我的员工页面中有一个Response.Redirect,它将页面重定向到薪水页面。

Response.Redirect ("Salary.aspx");

在我添加如下异常处理之前,它一直运行正常。

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

//Remaining code in event handler

这导致了一个新的异常,提示“线程正在被中止”。我发现可以通过将endResponse设置为false来避免这种情况。

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

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

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

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

问题

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

陷阱

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

参考资料

  1. 为什么Response.Redirect会导致System.Threading.ThreadAbortException?
  2. ASP.NET异常“Thread was being aborted”导致方法退出

性能可以从不同的方面进行衡量!!! 你具体期望什么? - huMpty duMpty
@huMptyduMpty 性能从以下两个方面考虑:1)页面响应时间 2)内存使用。 - LCJ
1
另外,由于您正在尝试提高网站性能,这篇文章也可能会提供一些信息。 - huMpty duMpty
2
我认为如果你担心Response.Redirect抛出异常会导致性能问题,那么你可能是过早地进行了优化。 - Matthew
2
你的问题在于你处理异常的方式不好。只需摆脱这些try/catch块,改用ASP.NET Health Monitoring即可。 - John Saunders
1个回答

12

结束响应(Response.Redirect(url)Response.Redirect(url, true))不会比Response.Redirect(url, false)的性能更好。使用false,由于您控制着代码执行,当您要重定向用户时,可以简单地不再执行任何其他代码。

这在Response.Redirect()MSDN条目中有说明:

如果将endResponse参数指定为true,则此方法将调用原始请求的End方法,该方法在完成时引发ThreadAbortException异常。 这个异常对Web应用程序性能产生了负面影响,因此建议将endResponse参数传递false。

您确实需要关注页面生命周期事件,正如您所指出的那样。 如果您要重定向用户,不仅是为了性能,就不应继续执行页面事件。最近我撰写了一个简短的示例,展示了如果不进行良好的编码/规划就可能发生的问题

该帖子的底线是Response.Redirect()会向浏览器返回302。当您使用Response.Redirect(url, false)时存在问题的潜在性,因为页面执行会继续进行,用户可以选择忽略302并查看本应呈现的页面...因此您需要采取措施确保他们不会看到任何您不想让他们看到的内容。 在测试时,Firefox的NoRedirect插件很有帮助。

为了达到最佳的性能表现:将 endResponse 参数设置为 "false",确保您没有运行任何其他代码,并确保页面不会呈现任何信息,如果用户忽略 302,则不希望用户看到。

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