asp.net CompleteRequest不会阻止处理其他回发事件

时间:2013-12-05 15:54:12

标签: c# asp.net

在Page_Load中,我有以下内容......

if (!IsPostBack)
{
  ...
}
else
{
   if (someCondition)
   {
      HttpContext.Current.ApplicationInstance.CompleteRequest();
      return;
   }
   ... Normal Processing ...
}

我不理解的两件事

  1. 我在调用CompleteRequest时设置了一个断点来验证我是否到达那里,而且我做到了。点击 F10 步骤移至return语句,而不点击我在Application_EndRequest

  2. global.asax处设置的断点
  3. 回发是点击网页上的按钮的结果。点击 F5 继续return语句后,我点击按钮Click处理程序设置的断点。当我在这里点击 F5 时,执行会在Application_EndRequest的断点处停止。

  4. 我认为CompleteRequest应该直接转到EndRequest并阻止处理任何其他页面事件。

1 个答案:

答案 0 :(得分:2)

实际上并非如此 - Visual Studio中集成的dev服务器未在集成模式下运行。测试:

var type = typeof(HttpRuntime);
var method = type.GetProperty("UseIntegratedPipeline", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
bool useIntegratedPipeline = (bool)method.GetValue(null, null);
// false for integrated dev server

对于CompleteRequest,从反射器开始,方法如下:

internal void CompleteRequest() {
  this._requestCompleted = true;
  if (HttpRuntime.UseIntegratedPipeline) {
    HttpContext context = this._application.Context;
    if (context != null && context.NotificationContext != null) {
      context.NotificationContext.RequestCompleted = true;
    }
  }
}

因此,除非您在集成模式下在IIS上运行Web应用程序,否则在调用CompleteRequest()之后不会立即发生任何事情。这里的启示是,dev服务器与IIS没有相同的行为。