Asp.net

Response.IsClientConnected 什麼時候慢?

  • February 1, 2012

我有一個長時間執行的 ASP 響應(實際上是一個 MVC 操作),如果使用者已經離開,我想取消它。我認為這應該相當簡單:

if(!this.Response.IsClientConnected)
{
   Response.End();
}

但是,我遇到了各種來源,開始認為這種方法很慢

所以我執行了自己的測試(使用MVC mini profiler,儘管你可以使用自己的):

using (var step = MiniProfiler.Current.Step("Response_IsClientConnected"))
if(!this.Response.IsClientConnected)
{
   Response.End();
}

這發現每次我呼叫它時都非常快:在我的開發人員設置中不到 1 毫秒。這是真的還是假的。

什麼情況下Response.IsClientConnected預計會慢?

我必須支持 IIS6 - 會Response.IsClientConnected更慢嗎?

有誰知道它在幕後做什麼?在低級別我希望 TCP/IP 堆棧知道連接是否仍然存在,所以我希望這個檢查是即時的,但是 IIS 是否需要做一些額外的工作來檢查?

好問題但遺憾的是沒有答案,但可以提供以下資訊。希望這可以成為了解它在幕後所做的事情的起點。

通過詢問處理請求Response.IsClientConnected的目前工作人員來檢查這一點。HttpWorkerRequest

worker 請求可以是以下類型之一,ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP)ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType). 這是從低級 ISAPI 到 ASP.NET 執行時的入口點。

  1. ISAPIWorkerRequestInProcForIIS6
  2. ISAPIWorkerRequestInProcForIIS7 >= IIS7
  3. ISAPIWorkerRequestInProc < IIS6
  4. ISAPIWorkerRequestOutOfProc 用於程序外請求

int EcbIsClientConnected(IntPtr pECB)對於所有 InProc HttpWorkerRequest 工作人員,然後通過呼叫位於擴展控制塊 (ECB) 中的呼叫將這個呼叫定向回非託管程式碼webengine.dll pECB,提供對 ISAPI 請求的所有低級訪問。此引用最初傳遞給ISAPIRuntime.ProcessRequest.

現在我找不到該EcbIsClientConnected方法的任何實現細節。因此,如果沒有這個,就不可能知道它在幕後做了什麼,以及這對於不同版本的 IIS 可能有何不同。也許其他人可以解釋這一點?我也想知道。

引用自:https://stackoverflow.com/questions/9094735