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,则将执行事件处理程序中的剩余代码。所以我们需要if检查剩余的代码(检查:是否不满足重定向条件)。

参考

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

1 回答 1

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)。

于 2012-12-05T16:26:00.817 回答