Response.IsClientConnected什么时候变慢?

时间:2012-02-01 11:06:08

标签: asp.net performance iis

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

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

但是我从various sources开始that this method is slow

所以我运行自己的测试(使用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是否还需要做一些额外的工作来检查?

1 个答案:

答案 0 :(得分: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 for proc of proc requests
  5. 对于所有InProc HttpWorkerRequest工作人员,此调用然后通过调用位于int EcbIsClientConnected(IntPtr pECB) webengine.dll作为扩展控制块(ECB)的pECB来定向回非托管代码,提供所有对ISAPI请求的低级别访问权限。此引用最初传递给ISAPIRuntime.ProcessRequest

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