Когда Response.IsClientConnected работает медленно? - PullRequest
10 голосов
/ 01 февраля 2012

У меня есть длительный ответ ASP (на самом деле действие MVC), который я хочу отменить, если пользователь ушел.Я думаю, что это должно быть довольно просто:

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

Однако я сталкивался с различными источниками начиная с , что этот метод медленный .

Итак, я запустил свои собственные тесты (используя MVC мини-профилировщик , хотя вы могли бы использовать свои собственные):

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

Это обнаружило, что каждый раз, когда я его называю, это всегда очень быстро: меньше 1 мсна моем разработчике.Это правда или ложь.

При каких обстоятельствах Response.IsClientConnected может быть медленным?

Я должен поддерживать IIS6 - будет ли Response.IsClientConnected медленнее?

Кто-нибудь знает, что он делает под одеялом?На низком уровне я ожидаю, что стек TCP / IP будет знать, все еще ли соединение установлено, поэтому я ожидаю, что эта проверка будет мгновенной, но нужно ли IIS выполнять дополнительную работу для проверки?

1 Ответ

11 голосов
/ 01 февраля 2012

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

Response.IsClientConnected проверяет это, запрашивая у текущего работника HttpWorkerRequest обработки запроса.

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

  1. ISAPIWorkerRequestInProcForIIS6
  2. ISAPIWorkerRequestInProcForIIS7> = IIS7
  3. ISAPIWorkerRequestPro1017 * ISAPIWorkerRequestOutOfProc Для запросов вне процесса

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...