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是集成的。