Response.IsClientConnected 什麼時候慢?
我有一個長時間執行的 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的目前工作人員來檢查這一點。HttpWorkerRequestworker 請求可以是以下類型之一,
ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP)由ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType). 這是從低級 ISAPI 到 ASP.NET 執行時的入口點。
- ISAPIWorkerRequestInProcForIIS6
- ISAPIWorkerRequestInProcForIIS7 >= IIS7
- ISAPIWorkerRequestInProc < IIS6
- ISAPIWorkerRequestOutOfProc 用於程序外請求
int EcbIsClientConnected(IntPtr pECB)對於所有 InProc HttpWorkerRequest 工作人員,然後通過呼叫位於擴展控制塊 (ECB) 中的呼叫將這個呼叫定向回非託管程式碼webengine.dllpECB,提供對 ISAPI 請求的所有低級訪問。此引用最初傳遞給ISAPIRuntime.ProcessRequest.現在我找不到該
EcbIsClientConnected方法的任何實現細節。因此,如果沒有這個,就不可能知道它在幕後做了什麼,以及這對於不同版本的 IIS 可能有何不同。也許其他人可以解釋這一點?我也想知道。