O verdadeiro ponto de entrada no tempo de execução do .NET ocorre em algumas classes e interfaces não documentadas (tradução: é claro, você pode usar o Reflector para visualizar J. Muito poucas pessoas, exceto a Microsoft, conhecem essas interfaces, e os caras da Microsoft não estão interessados nelas). falando sobre esses detalhes Eles acreditam que esses detalhes de implementação são de pouca utilidade para desenvolvedores que usam ASP.NET para desenvolver aplicativos.
O processo de trabalho (ASPNET_WP.EXE no IIS5, W3WP.EXE no IIS6) hospeda o tempo de execução .NET e a DLL ISAPI. Ele (o processo de trabalho) chama uma pequena interface não gerenciada do objeto COM e, por fim, envia a chamada para a classe ISAPIRuntime. Em uma instância (Anotação: O texto original é uma subclasse de instância da classe ISAPIRuntime, mas a classe ISAPIRuntime é uma classe selada, que é suspeita de ser um erro administrativo do autor, ou subclasse aqui não significa subclasse A primeira). entrada no tempo de execução é Esta classe não documentada implementa a interface IISAPIRuntime (para a especificação do chamador, esta interface é uma interface COM). Esta interface COM subjacente baseada em IUnknown é uma interface predeterminada estendida de ISAPI para ASP.NET. interface e sua assinatura de chamada (usando a excelente ferramenta .NET Reflector de Lutz Roeder http://www.aisto.com/roeder/dotnet/). Esta é uma boa maneira de explorar esse método passo a passo.
Figura 3 - Se você quiser se aprofundar nesta interface, abra o Reflector e aponte para o namespace System.Web.Hosting. A DLL ISAPI abre o acesso ao ASP.NET chamando uma interface COM hospedada. link apontando para o ponteiro ISAPI gerenciado Este BCE contém a capacidade de acessar a interface ISAPI completa usada para receber solicitações e enviar respostas de volta ao IIS.
A interface IISAPIRuntime serve como ponto de interface entre o código não gerenciado que se estende do ISAPI e do ASP.NET. (diretamente relacionado no IIS6) (via Named Pipes no IIS5) Se você olhar dentro desta classe, encontrará a função ProcessRequest com a seguinte assinatura:
[return: MarshalAs(UnownedType.I4)]
int ProcessRequest([In] IntPtr). ecb,
[In, MarshalAs(UnownedType.I4)] int useProcessModel);
o parâmetro ecb é o bloco de controle de extensão ISAPI (bloco de controle de extensão), que é passado para a função ProcessRequest como um recurso não gerenciado. Interface básica de entrada e saída, usada com objetos de solicitação e resposta ISAPI ECB contém todas as informações de solicitação de baixo nível, como variáveis de servidor, fluxos de entrada para variáveis de formulário e fluxos de saída para gravação de dados de volta ao cliente. toda a funcionalidade para acessar um recurso que pode ser acessado por solicitações ISAPI. ProcessRequest é o ponto inicial de entrada e saída deste recurso (ecb) para
extensões ISAPI manipularem solicitações de forma assíncrona. o processo de trabalho ou thread do IIS, mas o BCE permanecerá disponível durante o tempo de vida da solicitação atual. O BCE contém um mecanismo para informar à ISAPI que a solicitação foi processada (através do método ecb.ServerSupportFunction) (Anotação: Mais Para informações). , consulte o artigo sobre desenvolvimento de extensões ISAPI), o que faz com que o BCE seja liberado. Este método de processamento assíncrono libera imediatamente o thread de trabalho ISAPI e passa o processamento para um thread separado gerenciado pelo ASP.NET
e recebe referência para ecb
.use-o internamente para receber informações sobre a solicitação atual, como variáveis do servidor e dados POST. Ele também retorna informações para o servidor e permanece acessível (permanece ativo) até que a solicitação seja concluída ou o tempo limite expire. continue a se comunicar com ele até que o processamento da solicitação seja concluído. A saída é gravada no fluxo de saída ISAPI (usando ecb.WriteClient()) e a extensão ISAPI é notificada de que o processamento da solicitação foi concluído e libera o BCE. . Essa implementação é muito eficiente, porque as classes .NET são essencialmente apenas um wrapper muito "fino" em torno do ISAPI ECB eficiente e não gerenciado.
Carregando
o .NET - um pouco misterioso
.O tempo de execução do .NET é carregado. É aqui que as coisas ficam um pouco confusas. Não encontrei nenhuma documentação sobre esse processo e, como estamos falando de código nativo, não há uma boa maneira de descompilar a DLL ISAPI. descobrir (o código que carrega o tempo de execução do .NET).
O melhor palpite que posso fazer é que quando a extensão ISAPI recebe a primeira solicitação de uma extensão que mapeia para o ASP.NET, o processo carrega o tempo de execução do .NET. Depois que o tempo de execução existir, o código não gerenciado poderá solicitar uma instância de ISAPIRuntime para um diretório virtual especificado, se ele ainda não existir. Cada diretório virtual possui seu próprio domínio de aplicativo (AppDomain), quando um aplicativo independente (referindo-se a um programa ASP.NET). é iniciado, ISAPIRuntime sempre existiu no domínio do aplicativo a partir do processo de inicialização (Anotação: deve referir-se à instanciação de ISAPIRuntime) parece ser através de COM. Isso é feito porque os métodos de interface são expostos como métodos que podem ser chamados de COM
. Quando a solicitação de um diretório virtual chega, a função System.Web.Hosting.AppDomainFactory.Create() é chamada para criar uma instância de ISAPIRuntime. Isso inicia o processo de inicialização do aplicativo. Essa chamada recebe o tipo do aplicativo, o nome do módulo e as informações do diretório virtual. , que é usado pelo ASP.NET para criar o domínio do aplicativo e iniciar o programa ASP.NET para este diretório virtual As instâncias HttpRuntime (Anotação: O texto original é Este objeto derivado de HttpRuntime, mas HttpRuntime é uma classe selada, que é suspeita. seja um erro no texto original) são criados em um novo domínio de aplicativo. Cada diretório virtual (ou seja, um aplicativo ASP.NET está hospedado) é hospedado em um domínio de aplicativo separado e só será carregado quando um ASP específico. O programa .NET é solicitado. A extensão ISAPI gerencia instâncias desses objetos HttpRuntime e roteia solicitações internas com base no diretório virtual solicitado para o objeto HttpRuntime correto.
Figura 4 - Solicitações ISAPI são enviadas para o pipeline HTTP do ASP.NET usando algumas classes e interfaces não documentadas e chamando muitos métodos de fábrica. Cada aplicativo web/diretório virtual é executado em seu próprio domínio de aplicativo e o chamador (Anotação: DLL ISAPI) mantém uma referência. à interface IISAPIRuntime para acionar o processamento de solicitações do ASP.NET.