C# Can";EndResponse“;提高ASP.Net页面的性能

C# Can";EndResponse“;提高ASP.Net页面的性能,c#,asp.net,health-monitoring,C#,Asp.net,Health Monitoring,我有一个响应。在我的员工页面中重定向。它重定向到薪资页面 Response.Redirect ("Salary.aspx"); 在我添加如下异常处理之前,它工作得很好 try { Response.Redirect ("Salary.aspx"); } catch(Exception ex) { //MyLog(); throw new Exception(); } //Remaining code in event handler 这导致了一个新的异常,称为“线程被中止”。

我有一个
响应。在我的员工页面中重定向
。它重定向到薪资页面

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
    ,eventhandler中的剩余代码将被执行。因此,我们需要对剩余代码进行
    If
    检查(检查:如果未满足重定向条件)
  • 参考

  • 结束响应(
    response.Redirect(url)
    response.Redirect(url,true)
    将不会比
    response.Redirect(url,false)具有更好的性能
    。使用
    false
    ,由于您可以控制代码的执行,因此在重定向用户时,您不能再执行任何代码

    这在for
    Response.Redirect()中指定:

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

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

    这篇文章的底线是
    Response.Redirect()
    将302返回到浏览器。使用
    Response.Redirect(url,false)时可能会出现问题
    由于页面执行仍在继续,用户可以选择忽略302,而是查看本应呈现的页面……因此,您需要采取措施确保他们看不到您不希望他们看到的任何内容。Firefox插件在测试此功能时很有帮助


    要获得最佳性能:使用
    “false”“
    作为
    endResponse
    参数,确保您没有运行任何进一步的代码,并确保页面不会呈现任何您不希望用户忽略302的信息。

    性能可以从不同方面衡量!!!你到底期望什么?@huMptyduMpty从以下角度看性能1)页面响应时间2)内存使用同样,由于你试图提高网站性能,这可能也会提供一些信息。我认为,如果你担心
    响应。重定向
    引发异常会导致性能问题,然后,您可能会过早地进行优化。您的问题是,您在异常处理方面做得很糟糕。只需去掉这样的try/catch块,然后使用。