Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When is Response.IsClientConnected slow?

I have a long running ASP response (actually an MVC action) that I want to cancel if the user has navigated away. I think this should be fairly simple:

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

However I've come across various sources starting that this method is slow.

So I ran my own tests (using MVC mini profiler, though you could use your own):

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

That found that every time I call it it's consistently very fast: under 1ms on my developer set up. This is whether it's true or false.

Under what circumstances is Response.IsClientConnected expected to be slow?

I have to support IIS6 - would Response.IsClientConnected be slower on that?

Does anyone know what it's doing under the covers? At a low level I'd expect the TCP/IP stack to know whether the connection is still there, so I'd expect this check to be instant, but does IIS have to do some additional work to check?

like image 853
Keith Avatar asked Feb 01 '12 11:02

Keith


1 Answers

Good question but unfortunately don't have the answer, but can provide the following information. Hopefully this can be a starting point to know what's it's doing under the covers.

The Response.IsClientConnected is checking this by asking the current worker HttpWorkerRequest handling the request.

The worker request can be one of the following types and is created by the ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP) which is called by the ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType). This is the entry point from the low level ISAPI to the ASP.NET runtime.

  1. ISAPIWorkerRequestInProcForIIS6
  2. ISAPIWorkerRequestInProcForIIS7 >= IIS7
  3. ISAPIWorkerRequestInProc < IIS6
  4. ISAPIWorkerRequestOutOfProc For out of proc requests

For all the InProc HttpWorkerRequest workers this call is then directed back to unmanaged code by calling int EcbIsClientConnected(IntPtr pECB) which is located in the webengine.dll pECB being the Extension Control Block (ECB), provides all the low level access to the ISAPI request. This reference is initially passed to the ISAPIRuntime.ProcessRequest.

Now I can't find any implementation details of the EcbIsClientConnected method. So without this it's impossible to know what it's doing under the covers and how this maybe differs for the different versions of IIS. Maybe someone else can explain this? I would like to know as well.

like image 110
Martijn B Avatar answered Oct 18 '22 14:10

Martijn B