Реальная точка входа в среду выполнения .NET находится в некоторых недокументированных классах и интерфейсах (перевод: конечно, вы можете использовать Reflector для просмотра J. Очень немногие люди, кроме Microsoft, знают об этих интерфейсах, а ребята из Microsoft им не интересны). Говоря об этих деталях, они считают, что эти детали реализации малопригодны разработчикам, использующим ASP.NET для разработки приложений.
Рабочий процесс (ASPNET_WP.EXE в IIS5, W3WP.EXE в IIS6) содержит среду выполнения .NET и библиотеку DLL ISAPI. Он (рабочий процесс) вызывает небольшой неуправляемый интерфейс COM-объекта и в конечном итоге отправляет вызов классу ISAPIRuntime. На экземпляре (Аннотация: Исходный текст является экземплярным подклассом класса ISAPIRuntime, но класс ISAPIRuntime является запечатанным классом, что, по подозрению автора, является технической ошибкой, или подкласс здесь не означает подкласс Первый). запись в среду выполнения: Этот недокументированный класс реализует интерфейс IISAPIRuntime (для спецификации вызывающего объекта этот интерфейс является COM-интерфейсом). Этот базовый COM-интерфейс, основанный на IUnknown, представляет собой предопределенный интерфейс, расширенный от ISAPI до ASP.NET. На рис. 3 показан IISAPIRuntime. интерфейс и его сигнатуру вызова (с использованием превосходного инструмента .NET Reflector Лутца Рёдера http://www.aisto.com/roeder/dotnet/). Это хороший способ изучить этот пошаговый процесс.
Рисунок 3. Если вы хотите углубиться в этот интерфейс, откройте Reflector и укажите пространство имен System.Web.Hosting. ISAPI DLL открывает доступ к ASP.NET, вызывая размещенный COM-интерфейс, который получает недвоичный файл. ссылка, указывающая на управляемый указатель ISAPI ECB. Этот ECB содержит возможность доступа ко всему интерфейсу ISAPI, используемому для получения запросов и отправки ответов обратно в IIS.
Интерфейс IISAPIRuntime служит точкой интерфейса между неуправляемым кодом, исходящим из ISAPI и ASP.NET. (напрямую связано с IIS6). (через именованные каналы в IIS5). Если вы заглянете внутрь этого класса, вы найдете функцию ProcessRequest со следующей сигнатурой:
[return: MarshalAs(UnmanagedType.I4)]
int ProcessRequest([In] IntPtr)
.ecb,
[In, MarshalAs(UnmanagedType.I4)] int useProcessModel);
параметр ecb представляет собой блок управления расширением ISAPI (блок управления расширением), который передается в функцию ProcessRequest как неуправляемый ресурс. Эта функция принимает ECB в качестве неуправляемого ресурса. базовый интерфейс ввода и вывода, используемый с объектами Request и Response. ISAPI ECB содержит всю информацию о запросах низкого уровня, такую как переменные сервера, входные потоки для переменных формы и выходные потоки для записи данных обратно клиенту. все функции доступа к ресурсу, к которому можно получить доступ с помощью запросов ISAPI, ProcessRequest является начальной точкой входа и выхода для этого ресурса (ecb) для управляемого кода.
Расширения ISAPI обрабатывают запросы асинхронно. В этом режиме расширение ISAPI немедленно возвращает вызов. рабочий процесс или поток IIS, но ECB останется доступным в течение всего времени существования текущего запроса. ECB содержит механизм, позволяющий ISAPI узнать, что запрос был обработан (через метод ecb.ServerSupportFunction) (Аннотация: Подробнее. , см. статью о разработке расширений ISAPI), что приводит к освобождению ECB. Этот метод асинхронной обработки немедленно освобождает рабочий поток ISAPI и передает обработку отдельному потоку, управляемому ASP.NET,
получает ссылку на ecb и. используйте его для внутреннего получения информации о текущем запросе, такой как переменные сервера и данные POST. Он также возвращает информацию на сервер. ecb остается доступным (остается в живых) до тех пор, пока запрос не будет завершен или не истечет время ожидания. Таким образом, ASP.NET может. продолжайте взаимодействовать с ним до тех пор, пока обработка запроса не будет завершена. Вывод записывается в выходной поток ISAPI (с использованием ecb.WriteClient()), и расширение ISAPI уведомляется о завершении обработки и освобождает ECB. Эта реализация очень эффективна, поскольку классы .NET по сути представляют собой очень «тонкую» оболочку эффективного неуправляемого ISAPI ECB.
Загрузка .NET — немного загадочная
.Давайте сделаем шаг назад: я пропущу описание того, как Загружается среда выполнения .NET. Здесь все становится немного неясно. Я не нашел никакой документации по этому процессу, и, поскольку мы говорим о собственном коде, нет хорошего способа сделать это и декомпилировать ISAPI DLL. выясните это (код, который загружает среду выполнения .NET).
Лучшее, что я могу сделать, это то, что, когда расширение ISAPI получает первый запрос на расширение, которое отображается в ASP.NET, задание. Процесс загружает среду выполнения .NET. Как только среда выполнения существует, неуправляемый код может запросить экземпляр ISAPIRuntime для указанного виртуального каталога, если он еще не существует. Каждый виртуальный каталог имеет свой собственный домен приложения (AppDomain), когда независимое приложение (ссылается на программу ASP.NET). запускается, ISAPIRuntime всегда существовал в домене приложения с момента создания экземпляра (Аннотация: должно относиться к созданию экземпляра ISAPIRuntime), по-видимому, через COM. Это делается потому, что методы интерфейса предоставляются как вызываемые методы COM
. поступает запрос на виртуальный каталог, вызывается функция System.Web.Hosting.AppDomainFactory.Create() для создания экземпляра ISAPIRuntime. При этом начинается процесс запуска приложения. Этот вызов получает тип приложения, имя модуля и информацию о виртуальном каталоге. , который используется ASP.NET для создания домена приложения и запуска программы ASP.NET для этого виртуального каталога. Экземпляры HttpRuntime (Аннотация: исходный текст — это производный объект HttpRuntime, но HttpRuntime — это запечатанный класс, который подозревается). (что может быть ошибкой в исходном тексте) создаются в новом домене приложения. Каждый виртуальный каталог (то есть размещается приложение ASP.NET) размещается в отдельном домене приложения, и они будут загружаться только при наличии определенного ASP. Запрашивается программа .NET. Расширение ISAPI управляет экземплярами этих объектов HttpRuntime и направляет внутренние запросы на основе запрошенного виртуального каталога к правильному объекту HttpRuntime.
Рис. 4. Запросы ISAPI отправляются в HTTP-конвейер ASP.NET с использованием некоторых недокументированных классов, интерфейсов и вызова множества фабричных методов. Каждое веб-приложение/виртуальный каталог выполняется в своем собственном домене приложения, а вызывающая сторона (Аннотация: ISAPI DLL) поддерживает ссылку. к интерфейсу IISAPIRuntime для запуска обработки запроса ASP.NET.