在Page_Load中,我有以下内容......
if (!IsPostBack)
{
...
}
else
{
if (someCondition)
{
HttpContext.Current.ApplicationInstance.CompleteRequest();
return;
}
... Normal Processing ...
}
我不理解的两件事
我在调用CompleteRequest
时设置了一个断点来验证我是否到达那里,而且我做到了。点击 F10 步骤移至return
语句,而不点击我在Application_EndRequest
global.asax
处设置的断点
回发是点击网页上的按钮的结果。点击 F5 继续return
语句后,我点击按钮Click处理程序设置的断点。当我在这里点击 F5 时,执行会在Application_EndRequest
的断点处停止。
我认为CompleteRequest
应该直接转到EndRequest
并阻止处理任何其他页面事件。
答案 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没有相同的行为。