from:https://blogs.msdn.microsoft.com/tmarq/2009/06/25/correct-use-of-system-web-httpresponse-redirect/

  Try very, very hard to avoid using Response.Redirect(url), instead, use Response.Redirect(url, false).  Response.Redirect(url), after writing a 302 redirect response to the response buffers, calls Response.End.  This is very expensive.  The alternative, Response.Redirect(url, false) is fast, but unlike Response.Redirect(url), the lines of code which follow the call to Response.Redirect(url, false) will be executed.  More on this later, but first, let me tell you about the horrors of Response.End.

  Response.End is a terrible method.  It was added in ASP.NET 1.0 for compatibility with classic ASP.  In classic ASP, this method terminated script processing, so that the lines of script that followed this call never executed.  How do you simulate that in managed code?  The only way is to abort the thread, which raises a ThreadAbortException and is outrageously expensive.  Normally, that’s exactly what Response.End does in ASP.NET, however, if it is called from within an asynchronous handler/module (a.k.a. an asynchronous pipeline event), it will instead perform a synchronous flush of the response buffers (can you say expensive?) and then complete the request by calling Context.ApplicationInstance.CompleteRequest().  Either way, whether you’re calling it from a synchronous handler/module or an asynchronous handler/module, Response.End is horribly expensive, and you should avoid it.

  Ok, so what if you don’t want the lines of code to execute after you redirect?  Well, one way to accomplish this is to call HttpApplication.CompleteRequest(), which is accessible from the HttpContext. e.g., call calling Context.ApplicationInstance.CompleteRequest().  It’s not the same as aborting the thread, which truly does prevent all subsequent lines of code form running.  The lines of code that follow the call to CompleteRequest() will execute, but as soon as the current page or module that calls this completes, the pipeline will jump ahead to the EndRequest event, thereby short circuiting the pipeline.  This is usually all you need.

So to summarize…

BAD:

Response.Redirect(url);

GOOD:

Response.Redirect(url, false);\

Context.ApplicationInstance.CompleteRequest();

  But before I put my pen away, there’s one more common practice I’ve seen that people should be aware of .  In classic mode, calling Response.Redirect(url) from Application_Error without calling Server.ClearError is doubly expensive.  It causes three exceptions to be thrown, and then either raises a ThreadAbortException or does a synchronous flush and completes the response.  And in integrated mode, calling Response.Redirect(url) from Application_Error without calling Server.ClearError does not even work.  Instead, you should use the following code, which performs well in both classic mode and integrated mode.  If you’re going to redirect from Application_Error, you should do it the following way:

GOOD:

void Application_Error(object sender, EventArgs e)

{

   Server.ClearError();

Response.Redirect(url, false);

Context.ApplicationInstance.CompleteRequest();

}

  The behavior difference between classic and integrated mode with respect to calling Redirect from Application_Error without calling Server.ClearError is just due to the different environments.  You might notice that with a default 3.5 install, if you remove the ASP.NET ScriptModule from the IIS <modules> section, you’re suddenly able to call Redirect from Application_Error without calling Server.ClearError.  ScriptModule registers a PreSendRequestHeaders handler.  In integrated mode, the PreSendRequestHeaders event is implemented differently.  As a result, in integrated mode, the exception will be rendered if you try to redirect without clearing the error from Application_Error.  I’ve attached a sample that demonstrates the difference between the two pipelines.  This sample will demonstrate the difference regardless of whether or not ScriptModule is installed.  Just request default.aspx.  Then change the value of demonstratePipelineDifference in global.asax, and request default.aspx again.  Do this in both classic mode and integrated mode, and observe the behavior.

Thanks,

Thomas

sample.zip

Correct use of System.Web.HttpResponse.Redirect的更多相关文章

  1. 解决:无法在发送 HTTP 标头之后进行重定向。 跟踪信息: 在 System.Web.HttpResponse.Redirect(String url, Boolean endResponse, Boolean permanent) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>……

    问题:在MVC的过滤器中验证用户状态时报如下错误:   无法在发送 HTTP 标头之后进行重定向. 跟踪信息:   在 System.Web.HttpResponse.Redirect(String  ...

  2. log4net 中错误 System.Web.HttpException (0x80004005): 文件不存在

    用日志组件,Global 中配置的输出最后一个错误信息,总是出现下面的错误信息: 2014-04-01 14:35:41,757 级别:ERROR 信息:[Exception]:System.Web. ...

  3. System.Web Namespce

    System.Web概述: System.Web是.NET中web应用开发的一个基础类库,定义浏览器与服务器之间的所有操作方法,包括请求输入流(HttpRequest).输出流(HttpRespons ...

  4. 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 // 节中包括 System.Web.SessionSta

    我直接在父类的构造方法中调用了sessionj结果就报这个错误 搜了好久 让改web.config 可是不起作用 代码如下: public class BasePage:System.Web.UI.P ...

  5. C# Webservice 解决在运行配置文件中指定的扩展时出现异常。 ---> System.Web.HttpException: 超过了最大请求长度问

    摘自: http://blog.csdn.net/gulijiang2008/article/details/4482993 请在服务器端配置 方法一: 在通过WebService处理大数据量数据时出 ...

  6. 只有在配置文件中或 Page 说明会 enableSessionState 至 true 时刻,能够使用会话状态。另外,还要确保应用程序配置 // 段包含 System.Web.SessionSta

    首先,弄清楚我们的目的,我的目标是验证用户登录.那是,Session["userName"]!=null 在ok该 起初,我是这么写的,结果给出,提示如果上述错误标题,在调查的很长 ...

  7. System.Web

    如果 using System.Web:还是调用不出来其中的类,请在引用的位子添加 System.Web  引用,有的版本不自带这个命名空间. 类: HttpResponse类       用于绘画验 ...

  8. System.Web.Mvc.Controller.cs

    ylbtech-System.Web.Mvc.Controller.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicK ...

  9. System.Web.HttpContext.cs

    ylbtech-System.Web.HttpContext.cs 1.程序集 System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken ...

随机推荐

  1. 【Java】XML解析之DOM

    DOM介绍 DOM(Document Object Model)解析是官方提供的XML解析方式之一,使用时无需引入第三方包,代码编写简单,方便修改树结构,但是由于DOM解析时是将整个XML文件加载到内 ...

  2. NOIP2012 题解

    Vigenère 密码 这个名字实在打不来... 题解:模拟 #include <cstdio> #include <cstring> +; bool cj; int cl, ...

  3. php pdo预处理语句与存储过程

    很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制.预处理语句可以带来两大好处: 1.查询仅需解析(或预处理) ...

  4. 两个不等式(Nopier)

  5. java开发中的一些工具软件

    1. XJad, 反编译工具,类似于.Net中的Refractor.可以反编译单个jar文件或一个文件夹下的class文件,效果还不错. 2. dirtyJOE, class文件直接修改工具.有时想修 ...

  6. git flow的安装和使用

    确保安装了git 1.windows系统下安装 进入cmd clone github上的gitflow到一个文件夹下 我这里clone到 c:\gitflow git clone git://gith ...

  7. STL源码--iterator和traits编程技法

    第一部分 iterator学习 STL iterators定义: 提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式. 任何iteartor都应该提供5 ...

  8. Controller将Model数据传给View层,View层应该如何处理?

    首先,我们在Model层中添加一个Person类. namespace MVCTest.Models{    public class Person    {        public string ...

  9. ubuntu下配置安装PYQT4

    apt-get安装(快) sudo apt-get install libxext6 libxext-dev libqt4-dev libqt4-gui libqt4-sql qt4-dev-tool ...

  10. 仿知乎Android端回答UI

    个人觉得知乎这个回答界面非常的好看. 首先中间那个卡片,是cardview. 此外,要隐藏掉导航栏. 然后就是,怎么实现cardview怎么能有一半在蓝色部分呢? 首先要分成两部分,第一部分Textv ...