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

C# asp.net CompleteRequest不阻止处理其他回发事件,c#,asp.net,C#,Asp.net,在页面加载中,我有以下内容 if (!IsPostBack) { ... } else { if (someCondition) { HttpContext.Current.ApplicationInstance.CompleteRequest(); return; } ... Normal Processing ... } 有两件事我不明白 我在调用CompleteRequest时设置了一个断点,以验证我是否到达了那里,我做到了。点击F10

在页面加载中,我有以下内容

if (!IsPostBack)
{
  ...
}
else
{
   if (someCondition)
   {
      HttpContext.Current.ApplicationInstance.CompleteRequest();
      return;
   }
   ... Normal Processing ...
}
有两件事我不明白

  • 我在调用
    CompleteRequest
    时设置了一个断点,以验证我是否到达了那里,我做到了。点击F10到步骤将移动到
    return
    语句,而不点击我在
    global.asax中
    Application\u EndRequest
    设置的断点

  • 回发是点击网页上的一个按钮的结果。从
    return
    语句点击F5继续后,我在按钮点击处理程序上设置的断点被点击。当我在这里点击F5时,执行确实会在
    Application\u EndRequest
    的断点处停止


  • 我原以为
    CompleteRequest
    应该直接转到
    EndRequest
    并阻止处理任何进一步的页面事件。

    实际上不是这样的-Visual Studio中集成的开发服务器没有以集成模式运行。测试:

    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 server与IIS的行为不同。

    您是否使用集成管道?这是一个有趣的问题-谢谢。对不起-仍然键入。。。我正在使用Win7开发机器,并在VS2010中进行测试。我相信它正在使用集成管道的IIS7。DefaultAppPool是集成的。