Response.IsClientConnected什么时候变慢?

Kei*_*ith 10 asp.net iis performance

我有一个长期运行的ASP响应(实际上是一个MVC动作),如果用户已经导航,我想取消它.我认为这应该很简单:

if(!this.Response.IsClientConnected)
{
    Response.End();
}
Run Code Online (Sandbox Code Playgroud)

不过,我已经遇到各种渠道开始,这种方法是缓慢的.

所以我运行自己的测试(使用MVC迷你探查器,虽然你可以使用自己的):

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

结果发现每次我调用它都会非常快:我的开发人员设置不到1毫秒.这是真是假.

在什么情况下Response.IsClientConnected预计会很慢?

我必须支持IIS6 - 会Response.IsClientConnected更慢吗?

有谁知道它在幕后做了什么?在低级别,我希望TCP/IP堆栈知道连接是否仍然存在,所以我希望这个检查是即时的,但IIS是否还需要做一些额外的工作来检查?

Mar*_*n B 11

好问题但遗憾的是没有答案,但可以提供以下信息.希望这可以成为了解它在幕后做什么的起点.

Response.IsClientConnected被询问当前工作人员检查该HttpWorkerRequest处理请求.

工作者请求可以是以下类型之一,并由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用于超出proc请求

对于所有InProc HttpWorkerRequest工作程序,然后通过调用将该调用定向回非扩展控制块(ECB)int EcbIsClientConnected(IntPtr pECB)中的非托管代码webengine.dll pECB,提供对ISAPI请求的所有低级访问.此引用最初传递给ISAPIRuntime.ProcessRequest.

现在我找不到该EcbIsClientConnected方法的任何实现细节.因此,如果没有这个,就不可能知道它在幕后做了什么,以及对于不同版本的IIS,这可能有何不同.也许其他人可以解释这个?我也想知道.