【问题标题】:asp.net CompleteRequest does not prevent processing of other postback eventsasp.net CompleteRequest 不会阻止处理其他回发事件
【发布时间】:2013-12-05 15:54:11
【问题描述】:

在 Page_Load 我有以下...

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

两件事我不明白

  1. 我在调用CompleteRequest 时设置了一个断点,以验证我是否到达那里,我做到了。点击 F10 步进移动到return 语句,而不会遇到我在global.asax 中设置在Application_EndRequest 的断点

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

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

【问题讨论】:

  • 你在使用集成管道吗?
  • 这是一个有趣的问题 - 谢谢。
  • 对不起 - 仍在输入...我正在使用 Win7 开发机器并在 VS2010 中进行测试。我相信它正在使用带有集成管道的 IIS7。 DefaultAppPool 已集成。

标签: c# asp.net


【解决方案1】:

实际上不是 - 集成在 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() 调用之后不会立即发生任何事情。这里的启示是,开发服务器的行为与 IIS 不同。

【讨论】:

    猜你喜欢
    • 2015-06-23
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多