Ответ 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. Может, кто-то еще может это объяснить? Я также хотел бы знать.