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

Posted

技术标签:

【中文标题】“EndResponse”可以提高 ASP.Net 页面的性能吗【英文标题】:Can "EndResponse" increase performance of ASP.Net page 【发布时间】:2012-11-23 12:37:40 【问题描述】:

我的员工页面中有一个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 以继续处理。

问题

    “将 endResponse 设置为 false”是否可以提高性能,因为没有抛出异常? 由于页面生命周期事件未终止,“将 endResponse 设置为 false”是否会降低性能?

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

参考

    Why Response.Redirect causes System.Threading.ThreadAbortException? ASP.NET exception "Thread was being aborted" causes method to exit

【问题讨论】:

Performance可以从不同的方面来衡量!!!你到底期待什么? @huMptyduMpty 从以下几个方面看性能 1) 页面响应时间 2) 内存使用情况 另外,由于您试图提高网站性能,这个article 也可能会提供一些信息 我认为如果您担心Response.Redirect 抛出异常会导致性能问题,那么您可能会过早地进行优化。 你的问题是你的异常处理很糟糕。只需摆脱此类 try/catch 块,而是使用 ASP.NET Health Monitoring。 【参考方案1】:

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

这是在MSDN entry 中为Response.Redirect() 指定的:

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

正如您所指出的,您确实需要关注页面生命周期事件。如果您要重定向用户(不仅仅是为了性能),则不应继续执行页面事件。我最近写了一个简短的例子,显示 what can happen 如果你不这样做的话,编码/规划很差。

该帖子的底线是Response.Redirect() 向浏览器返回 302。当您使用 Response.Redirect(url, false) 时可能会出现问题,因为页面会继续执行,并且用户可以选择忽略 302,而是看到 将呈现 的页面......所以你需要采取措施确保他们看不到您不希望他们看到的任何内容。测试时,Firefox 的 NoRedirect 插件很有帮助。

为了获得最佳性能:使用"false" 作为endResponse 参数,确保您没有运行任何进一步的代码,并确保页面不会呈现任何您没有的信息'不想让用户看到他们是否忽略了 302。

【讨论】:

以上是关于“EndResponse”可以提高 ASP.Net 页面的性能吗的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET:如何在这几行代码中提高内存使用率?

Response.Redirect 方法的 endResponse 参数的默认值是多少

如何提高ASP.NET页面载入速度的方法

提高 ASP.NET Web 应用性能

提高 ASP.NET Web 应用性能的 24 种方法和技巧

asp.net提高程序性能的技巧