可以“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
继续处理。
题
- “将endResponse设置为false”是否可以提高性能,因为不会抛出exception?
- “将endResponse设置为false”是否会降低性能,因为页面生命周期事件未终止?
陷阱
- 如果将endResponse设置为
false
,则将执行eventhandler中的剩余代码。 因此,我们需要对剩余代码进行if
检查(检查:是否未满足重定向条件)。
参考
- 为什么Response.Redirect导致System.Threading.ThreadAbortException?
- 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的任何信息。
- ASP.NET Web API – 没有“MediaTypeFormatter”可用于读取“Int32”类型的对象
- 如何在asp.net 4.0中获取所有网络打印机
- 每隔几分钟在global.asax中执行一次方法
- 怎样恢复能在asp.net中使用c#下载文件 – >最好的方法(对于大文件也是如此)
- 帮助将字符串日期转换为DateTime
- 如何将图像裁剪成圆圈?
- System.Net.Mail.SmtpException:操作已超时。 asp.net中的错误使用godaddy托管发送邮件代码
- ASP.NET MVC 6中MVC Controller和Web API Controller有什么区别?
- 使用自定义角色在ASP.NET标识中初始化RoleManager