Когда происходит реакция 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 выполнять дополнительную работу для проверки?

Ответ 1

Хороший вопрос, но, к сожалению, нет ответа, но может предоставить следующую информацию. Надеюсь, это может послужить отправной точкой для того, чтобы знать, что он делает под обложками.

Response.IsClientConnected проверяет это, запрашивая текущий рабочий HttpWorkerRequest, обрабатывающий запрос.

Рабочий запрос может быть одним из следующих типов и создается ISAPIWorkerRequest.CreateWorkerRequest(IntPtr ecb, bool useOOP), который вызывается ISAPIRuntime.ProcessRequest(IntPtr ecb, int iWRType). Это точка входа с низкого уровня ISAPI в среду выполнения ASP.NET.

  • ISAPIWorkerRequestInProcForIIS6
  • ISAPIWorkerRequestInProcForIIS7 >= IIS7
  • ISAPIWorkerRequestInProc < IIS6
  • ISAPIWorkerRequestOutOfProc Для выполнения запросов proc

Для всех работников InProc HttpWorkerRequest этот вызов затем перенаправляется обратно в неуправляемый код, вызывая int EcbIsClientConnected(IntPtr pECB), который находится в webengine.dll pECB, являющемся Блоком управления расширением (ECB), обеспечивает весь доступ на низком уровне к запрос ISAPI. Эта ссылка сначала передается на ISAPIRuntime.ProcessRequest.

Теперь я не могу найти детали реализации метода EcbIsClientConnected. Таким образом, без этого невозможно понять, что он делает под обложками и как это может отличаться для разных версий IIS. Может, кто-то еще может это объяснить? Я также хотел бы знать.