[英]asp.net CompleteRequest does not prevent processing of other postback events
在Page_Load中,我有以下內容...
if (!IsPostBack)
{
...
}
else
{
if (someCondition)
{
HttpContext.Current.ApplicationInstance.CompleteRequest();
return;
}
... Normal Processing ...
}
我不明白的兩件事
我在對CompleteRequest
的調用處設置了一個斷點,以驗證是否到達該位置,並且可以。 擊中F10以移至return
語句,而不會達到我在global.asax
中的Application_EndRequest
設置的斷點
回發是單擊網頁上的按鈕的結果。 擊中F5以從return
語句繼續后,將擊中我在按鈕Click處理程序上設置的斷點。 當我在這里按F5時 ,執行確實在Application_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()調用之后不會立即發生任何事情。 這里的啟發是,開發服務器的行為與IIS不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.