Membro registrado, crie seu banco de dados de desenvolvimento da Web, Prefácio
O ASP.NET não é uma atualização simples do ASP, mas uma parte importante do Plano Microsoft .NET. Para a programação de janelas do Windows, fornece uma boa interface de programação para o desenvolvimento de grandes funções de aplicativos de rede e pode melhorar bastante a eficiência do trabalho dos desenvolvedores.
No entanto, o processo de "conversão de uma hora, duas compilações" faz com que o arquivo ASPX pareça um pouco inadequado quando a primeira execução (ou a primeira operação após a atualização), especialmente no ambiente de aplicativos de um grande número de arquivos de código ASPX e CodeHind, compilar A compilação do arquivo ASPX é publicada após a DLL (no .NET, conhecido como conjunto de aplicativos), eliminando o tempo de "uma conversão, uma compilação" e a taxa de uso da CPU, que melhorará bastante o desempenho geral dos serviços da Web. Obviamente, depois de ser compilado na DLL, a confidencialidade do código -fonte também melhorou até certo ponto.
Este artigo apresenta o processo de processamento básico do ASP.NET e uma análise de uma descoberta secreta. "" TRAP ", compila os arquivos ASPX disponíveis com o arquivo ASPX da CodeBehind no processo DLL. No final do artigo, também são introduzidas dicas para o processo de operação real.
Como este artigo envolve os conceitos como os aplicativos ASP.NET, compilação da linha de comando, arquivos de configuração web.config etc., a fim de permitir que os leitores entendam melhor o conteúdo deste artigo e fazer com que este artigo não pareça mais acumulado, Primeiro, os sistemas correspondentes a este artigo, este artigo é correspondente ao sistema correspondente deste artigo.
Ambiente do sistema:
Win2000 (SP3) + IIS5 + .NET Framework 1.0 (versão chinesa).
Nome do servidor:
Como os exemplos deste artigo são testados nesta máquina, o nome do servidor é localhost.
Configurações do IIS:
Estabeleça um DLLTEST de diretório virtual (o caminho real é w:/wwwroot/dllTest) e defina -o como um aplicativo para criar um diretório de bin no DLLTest. Todos os arquivos de origem serão colocados no diretório DLLTest e todos os arquivos DLL serão colocados no diretório DLLTest/bin.
Arquivo de configuração do aplicativo ASP.NET -web.config
Crie um arquivo web.config no diretório DLLTest.
<?
<figuration>
<System.Web />
</figuration>
Janela de comando (janela do DOS)
Abra a janela de comando e use o comando CD para criar o diretório atual como w:/wwwroot/dllTest.
1. Estabeleça um mapeamento de ASPX para DLL
Primeiro de tudo, vamos ver como o arquivo ASPX é processado pelo ASP.NET:
Quando uma solicitação http (como "http: //webserver/webapp/webpage.aspx") é enviada do cliente para o servidor IIS, o IIS captura e analisa a solicitação e, quando analisa esta solicitação como uma página ASPX, imediatamente Use a página ASPX para usar imediatamente a página ASPX. WebApp/webpaage.aspx "Existe. Se ele não existir, retorne ao cliente e retorne ao erro HTTP 404 (arquivo não encontrado), caso contrário, encontre o arquivo DLL correspondente no diretório temporário do ASP.NET, se não existir ou a DLL é "antiga" que o arquivo de origem ASPX, ligue para o compilador CSC (se o script de serviço ASPX do script do lado do serviço do ASPX, o idioma for VB ou JScript, chama o compilador VBC correspondente, JSC Compiler) para compilar O arquivo ASPX na DLL e, em seguida, asp.net chama a DLL para lidar com solicitações específicas do cliente e retornar à resposta do servidor.
Pode ser visto neste processo de processamento. Então, existe outra maneira de forçar o processamento de "rota" para um arquivo ASPX para uma DLL compilada? O método é adicionar itens de mapeamento de ASPX aos DLL na seção Httphandlers da seção System.Web da seção System.Web no aplicativo ASP.NET.
<DD verbo =* caminho = ASPX Nome do arquivo Tipo = Nome da classe, arquivo dll/>
Arquivo ASPX: o nome virtual do "roteamento" é necessário e a extensão deve ser ASPX, caso contrário, o IIS processará o arquivo primeiro no ambiente de execução do ASP.NET.
Arquivo DLL: Nome do arquivo dll (conjunto de aplicativos), não é necessário inserir ".dll". O ASP.NET primeiro pesquisa a DLL de montagem no aplicativo do aplicativo para o aplicativo do aplicativo e, em seguida, pesquisa a DLL de montagem no cache do cache do sistema.
Nome da classe: Como uma DLL pode ter vários nomes ou várias classes, cuja classe deve ser carregada automaticamente quando a DLL chama.
Por exemplo, o arquivo web.config de um determinado aplicativo ASP.NET é o seguinte:
<?
<figuration>
<System.Web>
<httphandler>
<DD verbo =* caminho = index.aspx type = bbs.indexpage, bbs />
</httphandler>
</ssystem.web>
</figuration>
O arquivo de configuração informa ao ASP.NET que, quando o cliente solicita o arquivo index.aspx deste aplicativo, chama diretamente o BBS.dll no diretório da BIN do aplicativo e carrega automaticamente a classe BBS.Indexpage.
2. O desenvolvimento pode lidar com a DLL da página HTML
Deve -se ressaltar que nem toda a DLL de aplicativos pode implementar o modo de solicitação/resposta HTTP. Vamos dar uma olhada na descrição do "Programa de Processamento HTTP e da fábrica" no tutorial de entrada rápida do Microsoft ASP.NET (http://chs.gotdotnet.com/quickstart/aspples/):
O ASP.NET fornece solicitações de baixo nível/APIs de resposta, permitindo que os desenvolvedores usem a classe .NET Framework para fornecer serviços para solicitações HTTP que foram introduzidas. Para esse fim, os desenvolvedores precisam criar uma classe que suporta system.web.ihttphandler interface e implementar o método processrequest (). Ao processar a solicitação HTTP, não requer o serviço fornecido pela estrutura de página de alto nível, o programa de processamento geralmente é útil. Os usos comuns dos programas de processamento incluem textos e aplicativos semelhantes ao CGI, especialmente os aplicativos que retornam dados binários.
Cada solicitação da solicitação HTTP recebida pelo ASP.NET é finalmente tratada por uma instância específica da classe que implementa o IHTTPHandler. O iHttphandlerFactory fornece uma estrutura que processa a análise real da solicitação de URL da instância do iHttphandler. Além da classe IHTTPHLATFACTORIAL Padrão fornecida pelo ASP.NET, os desenvolvedores também podem optar por criar e registrar fábricas para suportar um grande número de soluções de análise e ativação de solicitação.
Pode ser visto neste texto que, quando a página ASPX não envolve a tecnologia avançada de interface fornecida pela estrutura .NET (como cache de dados, manutenção de estado, referência de controle de janelas da web etc.), especialmente ao retornar dados binários (como como Como imagens, sons, etc.) para o cliente, você pode usar um arquivo de aplicativo .cs (usando o idioma c#aqui, se você usar VB ou JScript, ...) e o aplicativo que o programa deve ter uma classe para implementar System.web.ihttphandler interface e implemente o método ProcessRequest (). Um exemplo simples é o seguinte:
/* Arquivo de origem: ex1.cs inicia*/
usando System.Web;
namespace dlltenst
{{
/*
A classe deve implementar a interface ihttphandler. Se o programa acessar o status da sessão, a interface IrequiressessionState deverá ser implementada (a interface do marcador que não inclui nenhum método).
*/
Classe pública Ex1Page: ihttphandler
{{
/*
O atributo isreusable informa à estrutura .NET que este programa pode ser usado por vários threads ao mesmo tempo.
O verdadeiro corresponde; se o falso corresponde.
*/
Public bool isreusable
{{
obtenha {return true;}
}
/*
Implemente o método ProcessRequest e retorne os dados de resposta ao cliente.
Neste exemplo, retorne uma página HTML simples ao cliente
*/
Public void ProcessRequest (contexto httpContext)
{{
httpResponse res = context.Response;
res.write (<html> <body>);
Res.Write (<H1> DLLTEST -EX1 (Exemplo 1) </h1> <hr>);
Res.Write (esta página é tratada diretamente pela DLL);
res.write (</html> </body>);
}
}
}
/* Arquivo de origem: Ex1.cs End*/
No estado da linha de comando, os seguintes comandos de compilação compilam ex1.cs em ex1.dll e armazenam -o no diretório da bin.
Csc /t: biblioteca /oxin/ex1.dll ex1.cs
Adicione aspx-> mapeamento de dll ao arquivo de configuração Web.config.
<?
<figuration>
<System.Web>
<httphandler>
<Ded verb =* path = dlltest1.aspx type = dlltest.ex1page, ex1 />
</httphandler>
</ssystem.web>
</figuration>
Agora, quando o navegador visita http: //localhost/dlltest/dlltest1.aspx, na verdade é o método do ProcessressRequest da classe DLLTest.Ex1Page no Ex1.dll.
Terceiro, compilar um único arquivo ASPX em DLL
A julgar pelo "significado fora da Microsoft" descrito publicamente na seção anterior, a Microsoft não suporta desenvolvedores para compilar arquivos ASPX diretamente na DLL. No entanto, a tecnologia ASP.NET Advanced Interface (controle HTML do servidor, controle da Web etc.) precisa ser exibido através do arquivo ASPX. . de.
Agora acalme -se para analisar:
O compilador CSC é apenas um compilador de idioma C#. arquivo de origem.
Portanto, para compilar o arquivo ASPX em um arquivo DLL, o arquivo ASPX deve ser convertido em um arquivo de origem CS que pode ser reconhecido pelo compilador CSC. Então, quais ferramentas são usadas para converter? Embora eu acredite que essa ferramenta deve estar oculta na estrutura .nt, verifiquei um grande número de documentos públicos e .NET e manuais de referência. Após as informações, as informações relevantes ainda não foram encontradas.
Oh, não há como o mundo, e uma oportunidade acidental ainda me faz descobrir esse segredo.
Dê uma olhada no arquivo de origem ex2.aspx:
/* Arquivo de origem: ex2.aspx Iniciar*/
< %@ página de página = c# %>
<script runat = server>
/*
Você leu certo, a próxima linha é "ABCDEFG".
No texto, eu chamo essa linha de "armadilha de código"
*/
armadilha de código abcdefg //
void Page_load (objeto src, EventArgs args)
{{
if (! ispostback) notlabel.text = por favor, digite seu nome:;
}
Void onNamesubMit (Object SRC, EventArgs Args)
{{
Nome da string = f_name.value;
notlabel.text = (nome ==)? Bem-vindo! ;;
}
</script>
<html>
<Body>
<Form runat = servidor>
<H1> DLLTEST -EX2 (Exemplo 2) </h1>
<HR>
<ASP: Rótulo Runat = ID do servidor = NotLabel Style = Color: Red;
<entrada runat = ID do servidor = f_name size = 8>
<Botão runat = server onServerClick = onNamesubMit> ok </butut>
</morm>
</body>
</html>
/* Arquivo de origem: ex2.aspx final*/
Se o "Code Trap" Comentários ou excluir, o Ex2.aspx for um arquivo ASP.NET simples.
Agora vamos abrir a "armadilha" e ver o que o ASP.NET retornou?
Retornou uma página "Erro de compilação" e os arquivos de origem do relatório não podem ser compilados. O interessante é interessante é o hiperlink chamado "Mostre a fonte completa de compilação" na parte inferior da página. Remova esta parte da "fonte completa de compilação" e remova as informações do número da linha anterior e alguns outros comandos de compilação (principalmente #line compilem comandos) e feche a fofa "Code Trap", ele exclua também) e, depois de terminar, salve -o como ex2_aspx .cs:
/* Arquivo de origem: ex2_aspx.cs Iniciar*/
/*
A partir da descrição abaixo, pode -se observar que existe de fato uma ferramenta ininterrupta para concluir o arquivo ASPX de conversão em um arquivo de origem CS
*/
// -------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- ----------------- --------------------------------- ---------------------------------------------
// <Emogegenerate>
// Este código também foi gerado por um.
// Versão de tempo de execução: 1.0.3705.0
//
// Chinges neste arquivo pode se importar com comportamento incorreto e será perdido se
// O código é regenerado.
// </apogenerate>
// -------------------------------------------------- -------------------------------------------------------- -------------------------------------------------------- ----------------- --------------------------------- ---------------------------------------------
/*
Estranhamente: Nomear espaço é realmente asp em vez de aspx
Recomenda -se alterar o nome para o nome adequado para aplicações para evitar conflitos de nomeação, como para este artigo, você pode mudar para o DLLTestest
Eu não mudei aqui para deixar todos ver sua aparência original
*/
namespace asp {
usando o sistema;
usando System.Collections;
Usando System.Collection.Specialized;
usando System.Configuration;
usando System.Text;
Usando system.text.regularexpressões;
usando System.Web;
usando System.Web.caching;
usando System.Web.SessionState;
Usando o System.Web.Security;
usando system.web.ui;
usando o System.web.ui.webcontrols;
usando o System.web.ui.htmlControls;
/*
1. Preste atenção à composição do nome da classe.
2. Preste atenção à sua classe base. System.Web.ui.Page implementa a interface ihttphandler.
*/
classe pública Ex2_aspx: system.web.ui.page, System.Web.SessionState.ireQuiresseneationState {
Private estático int __autoHandler;
System.web.ui.webcontrols.label Notelabel;
Protected system.web.ui.htmlControls.htmlinputText f_name;
Protected System.web.ui.htmlControls.htmlbutton __Control3;
System.web.ui.htmlControls.htmlform __Control2;
Private estático bool __Intialized = false;
Sistema estático privado.Collection.ArrayList __FiledEpendências;
/* Agora você pode desligar a "armadilha"*/
// abcdefg
void Page_load (objeto src, EventArgs args)
{{
if (! ispostback) notlabel.text = por favor, digite seu nome:;
}
Void onNamesubMit (Object SRC, EventArgs Args)
{{
Nome da string = f_name.value;
notlabel.text = (nome ==)? Bem-vindo! ;;
}
/* Função de construção*/
public ex2_aspx () {
System.Collection.ArrayList Dependências;
if (asp.ex2_aspx .__ Intialize == false) {{
dependências = new System.Collection.ArrayList ();
/*
As linhas a seguir devem ser anotadas para que a DLL se torne um arquivo independente independente
Evite o novo e antigo de seus arquivos de "dependência" quando a DLL estiver em execução
*/
//Dependences.add (w: //wwwroot/dlltest/ex2.aspx);
asp.ex2_aspx .__ fileDependências = dependências;
ASP.EX2_ASPX .__ Intialized = true;
}
}
Substituição protegida int AutoHandler {
pegar {
Retornar asp.ex2_aspx .__ AutoHandler;
}
definir {
asp.ex2_aspx ._ AutoHandlers = value;
}
}
Protected System.web.httpage ApplicationInstance {
pegar {
Return ((system.web.httpApplication) (this.context.applicationInstance));
}
}
Public Substitua modelos de stringsourceDirectory {
pegar {
Retorno /dLlTest;
}
}
private System.web.ui.Control __buildControlnotelabel () {
System.web.ui.webcontrols.label __ctrl;
__ctrl = new System.web.ui.webcontrols.label ();
this.NotLabel = __ctrl;
__Ctrl.id = notelabel;
(System.web.ui.iattributeAccessor) (__ Ctrl).
Retornar __ctrl;
}
Private System.web.ui.Control __buildcontrolf_name () {{)
System.web.ui.htmlControls.htmlinputText __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlinputText ();
this.f_name = __ctrl;
__ctrl.id = f_name;
__ctrl.size = 8;
Retornar __ctrl;
}
private System.web.ui.Control __buildControl__control3 () {{)
System.web.ui.htmlControls.htmlbutton __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlbutton ();
Este .__ Control3 = __ctrl;
System.web.ui.iparSserAccessor __Parser = (System.Web.ui.iparAccessor) (__ctrl));
__Parser.AddparsedSubObject (new System.web.ui.literalControl (OK));
__Ctrl.ServerClick += new System.EventHandler (this.onNamesubMit);
Retornar __ctrl;
}
private System.Web.ui.Control
System.web.ui.htmlControls.htmlform __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlform ();
Este .__ Control2 = __ctrl;
System.web.ui.iparSserAccessor __Parser = (System.Web.ui.iparAccessor) (__ctrl));
__Parser.AddParsedSubObject (new System.web.ui.literalControl (/r/n <h1> dlltest -ex2 (Exemplo 2) </h1>/r/n <hr>/r/n))
Este .__ BuildControlNotelabel ();
__Parser.AddparsedSubObject (this.notelabel);
__Parser.AddparsedSubObject (new System.web.ui.literalControl (/r/n));
Este .__ BuildControlf_Name ();
__Parser.AddparsedSubObject (this.f_name);
__Parser.AddparsedSubObject (new System.web.ui.literalControl (/r/n));
este .__ BuildControl__control3 ();
__Parser.AddparsedSubObject (este .___ Control3);
__Parser.AddparsedSubObject (new System.web.ui.literalControl (/r/n));
Retornar __ctrl;
}
Private void __buildcontroltree (System.Web.ui.Control __ctrl) {
System.web.ui.iparSserAccessor __Parser = (System.Web.ui.iparAccessor) (__ctrl));
__Parser.AddparsedSubObject (new System.web.ui.literalControl (/r/n/r/n <html>/r/n <body>/r/n));
Este .__ BuildControl__control2 ();
__Parser.AddparsedSubObject (this .___ Control2);
__Parser.AddparsedSubObject (new System.web.ui.literalControl
}
Substituição protegida void frameworkInitialize () {
Este .__ BuildControltree (isto);
this.filedEpendences = asp.ex2_aspx .__ fileDependências;
this.enableViewstatemac = true;
}
Public Subster int getTypehashCode () {) {)
Retornar -11574299;
}
}
}
/* Arquivo de origem: ex2_aspx.cs end*/
Acredito que, depois de analisar esse arquivo, você terá um entendimento adicional do princípio da operação do ASP.NET (não tem nada a ver com este artigo, irracional).
No estado da linha de comando, os seguintes comandos de compilação compilam ex2_aspx.cs no ex2.dll e armazenam -o no diretório do bin.
Csc /t: biblioteca /oxin/ex2.dll ex2_aspx.cs
Adicione o mapeamento aspx-> dll ao arquivo de configuração web.config, ou seja, adicione as seguintes linhas em httphandlers na seção System.web:
<Derb =* path = dlltest2.aspx type = asp.ex2_aspx, ex2 />
Agora, quando o navegador visitar http: //localhost/dlltest/dlltest2.aspx, é como acessar o ex2.aspx. Obviamente, mesmo que o Ex2.aspx não exista, ou tenha sido atualizado, não terá nenhum impacto no acesso à página, a menos que o bin/ex2.dll seja re -gerado.
Quarto, compilar o arquivo ASPX do CodeBehind em DLL
Para compilar o arquivo ASPX do CodeBehind em DLL, o princípio de converter o arquivo ASPX em um arquivo de origem CS é o mesmo que acima. como um arquivo de origem CS. A diferença são as etapas quando compiladas em DLL: (por conveniência da narrativa, assumindo que o arquivo de interface é ex3.aspx, o arquivo codebehind é ex3.aspx.cs, e a "fonte completa de compilação" do EX3.aspx é armazenada como ex3_aspx.cs))
Etapa 1: primeiro use o seguinte comando para compilar ex3.aspx.cs em bin/ex3.aspx.cs.dll
Csc /t: biblioteca /oxin/ex3.aspx.cs.dll ex3.aspx.cs
Etapa 2: use o seguinte comando para compilar ex3_aspx.cs em bin/ex3.dll
Csc /t: biblioteca /r:bin/ex3.aspx.cs.dll /out:bin/ex3.dll ex3_aspx.cs
Em seguida, adicione o mapeamento aspx-> dll ao arquivo de configuração web.config, ou seja, adicione as seguintes linhas em httphandlers na seção System.web:
<add verb =* path = dlltest3.aspx type = asp.ex3_aspx, ex3 />
Agora abra o navegador e visite http: //localhost/dlltest/dlltest3.aspx.
Cinco, um pequeno truque
Ao definir a "armadilha" para converter o arquivo ASPX em um arquivo de origem CS, geralmente use o método de cópia e colar para salvar a "fonte completa de compilação" no bloco de notas ou vs.net ou em outro ambiente de desenvolvimento do ASP.NET e, em seguida, salve Depois de terminar a preservação dos arquivos de origem CS.
A organização é remover as informações do número da linha da pasta e a instrução de compilação "#Line". Se essas informações forem excluídas manualmente, serão muito problemáticas.
Um dos truques que eu uso é: no notebook, use o método de substituição para organizar rapidamente. Use/* Linha para substituir todas as linhas, use:*/Para substituir todos:, use // linhas de linha para substituir toda a linha, depois que a substituição é concluída, anote a "armadilha de código", defina as configurações da função de classe principal , defina as configurações da função principal do construtor As frases de "arquivos de dependência" são anotadas; portanto, mesmo que o acabamento esteja concluído.