簡體   English   中英

asp.net CompleteRequest不會阻止其他回發事件的處理

[英]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 ...
}

我不明白的兩件事

  1. 我在對CompleteRequest的調用處設置了一個斷點,以驗證是否到達該位置,並且可以。 擊中F10以移至return語句,而不會達到我在global.asax中的Application_EndRequest設置的斷點

  2. 回發是單擊網頁上的按鈕的結果。 擊中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM