Membre enregistré, créez votre base de données de développement Web, préface
ASP.NET n'est pas une simple mise à niveau de l'ASP, mais une partie importante du plan Microsoft .NET. À la programmation de fenêtres de Windows, fournit une bonne interface de programmation pour le développement de grandes fonctions d'application réseau et peut considérablement améliorer l'efficacité du travail des développeurs.
Cependant, le processus "Conversion One -Time, deux compilations" fait que le fichier ASPX apparaît légèrement inadéquat lorsque la première exécution (ou la première opération après mise à jour), en particulier dans l'environnement d'application d'un grand nombre de fichiers de code ASPX et CodeHind, compile La compilation de fichiers ASPX qu'il est publiée après DLL (dans le .NET, connu sous le nom de jeu d'applications), éliminant le temps de "une conversion, une compilation" et le taux d'utilisation du processeur, qui améliorera considérablement les performances globales des services Web. Bien sûr, après avoir été compilé en DLL, la confidentialité du code source s'est également améliorée dans une certaine mesure.
Cet article présente le processus de traitement de base d'ASP.NET et une analyse d'une découverte secrète. "" Trap ", compile les fichiers ASPX disponibles avec le fichier ASPX de CodeBehind dans le processus DLL. À la fin de l'article, des conseils pour le processus de fonctionnement réel sont également introduits.
Puisque cet article implique les concepts tels que les applications ASP.NET, la compilation de ligne de commande, les fichiers de configuration Web.config, etc., afin de permettre aux lecteurs de mieux comprendre le contenu de cet article et de faire en sorte que cet article ne soit plus accumulé, Tout d'abord, les systèmes correspondant à cet article, cet article correspond au système correspondant de cet article.
Environnement système:
Win2000 (SP3) + IIS5 + .NET Framework 1.0 (version chinoise).
Nom du serveur:
Étant donné que les exemples de cet article sont testés sur cette machine, le nom du serveur est localhost.
Paramètres IIS:
Établissez un répertoire virtuel dlltest (le chemin réel est w: / wwwroot / dlltest) et définissez-le en tant qu'application pour créer un répertoire bac sous dlltest. Tous les fichiers source seront placés dans le répertoire DLLTest et tous les fichiers DLL seront placés dans le répertoire DLLTEST / BIN.
Fichier de configuration de l'application ASP.NET - web.config
Créez un fichier web.config dans le répertoire DllTest.
<?
<Iconguration>
<system.web />
</FIGIGURATION>
Fenêtre de commande (fenêtre DOS)
Ouvrez la fenêtre de commande et utilisez la commande CD pour rendre le répertoire actuel comme w: / wwwroot / dlltest.
1. Établir une cartographie d'Aspx à la DLL
Tout d'abord, voyons comment le fichier ASPX est traité par ASP.NET:
Lorsqu'une demande HTTP (telle que "http: //webserver/webapp/webpage.aspx") est envoyée du client au serveur IIS, IIS capture et analyse la demande, et lorsqu'il analyse cette demande en tant que page ASPX, immédiatement, immédiatement Utilisez la page ASPX pour utiliser immédiatement la page ASPX. WebApp / webpaage.aspx "existe. S'il n'existe pas, revenez au client et revenez à l'erreur HTTP 404 (fichier introuvable), sinon trouver le fichier DLL correspondant dans le répertoire temporaire d'Asp.net, s'il n'existe pas ou la DLL est "ancien" que le fichier source ASPX, appelez le compilateur CSC (si le script de service ASPX du script côté service de l'ASPX, la langue est VB ou JScrip Le fichier ASPX dans DLL, puis ASP.NET appelle la DLL pour gérer des demandes client spécifiques et revenir à la réponse du serveur.
Il peut être vu à partir de ce processus de traitement. Y a-t-il donc un autre moyen de forcer le traitement de "Route" vers un fichier ASPX vers une DLL compilée? La méthode consiste à ajouter ASPX aux éléments de mappage DLL dans la section httphandlers de la section System.web de la section System.Web dans l'application ASP.NET.
<dd verb = * path = aspx nom de fichier type = nom de classe, fichier dll />
Fichier ASPX: le nom virtuel du "routage" est requis, et l'extension doit être ASPX, sinon IIS traitera d'abord le fichier dans l'environnement d'exécution ASP.NET.
Fichier DLL: fichier DLL (SET des applications) Nom, pas besoin d'entrer ".dll". ASP.NET recherche d'abord la DLL d'assemblage dans l'application de l'application pour l'application de l'application, puis recherche la DLL d'assemblage dans le cache de mise en cache de définition du système.
Nom de la classe: puisque une DLL peut avoir plusieurs noms ou plusieurs classes, quelle classe doit être automatiquement chargée lorsque DLL appelle.
Par exemple, le fichier web.config d'une certaine application ASP.NET est le suivant:
<?
<Iconguration>
<system.web>
<httphandler>
<dd verb = * path = index.aspx type = bbs.indexpage, bbs />
</ httphandler>
</sSystem.web>
</FIGIGURATION>
Le fichier de configuration indique à asp.net que lorsque le client demande le fichier index.aspx de cette application, appelle directement le bbs.dll dans le répertoire de la bin d'application et charge automatiquement la classe bbs.indexpage.
2. Le développement peut gérer la DLL de la page HTML
Il convient de souligner que toutes les DLL de toutes les applications ne peuvent pas implémenter le mode de demande / réponse HTTP. Jetons un coup d'œil à la description de "HTTP Processing Program and Factory" dans le tutoriel Microsoft ASP.NET Fast Entry (http://chs.gotdotnet.com/quickstart/aspplus/):
ASP.NET fournit des API de requêtes / réponse à bas niveau, permettant aux développeurs d'utiliser la classe .NET Framework pour fournir des services pour les demandes HTTP qui ont été introduites. À cette fin, les développeurs doivent créer une classe qui prend en charge l'interface System.Web.ihttphandler et implémenter la méthode processRequest (). Lors du traitement de la demande HTTP ne nécessite pas le service fourni par le cadre de page de niveau élevé, le programme de traitement est généralement utile. Les utilisations courantes des programmes de traitement incluent des screasters et des applications similaires à CGI, en particulier les applications qui renvoient les données binaires.
Chaque demande de la demande HTTP reçue par ASP.NET est finalement traitée par une instance spécifique de la classe qui implémente ihttphandler. IhttphandlerFactory fournit une structure qui traite l'analyse réelle de la demande d'URL d'instance ihttphandler. En plus de la classe IHTTPHandlerFactory par défaut fournie par ASP.NET, les développeurs peuvent également choisir de créer et d'enregistrer des usines pour prendre en charge un grand nombre de solutions d'analyse et d'activation de demande.
On peut voir à partir de ce texte que lorsque la page ASPX n'implique pas la technologie avancée de l'interface fournie par le .NET Framework (tel que le cache de données, le maintien de l'état, la référence de contrôle de la fenêtre Web, etc.), en particulier lors du retour des données binaires (telles En tant que photos, sons, etc.) pour le client, vous pouvez utiliser un fichier d'application .cs (en utilisant le langage C # ici, si vous utilisez VB ou JScript, ...), et l'application, le programme doit avoir une classe pour implémenter System.web.ihttphandler Interface et implémentez la méthode processRequest (). Un exemple simple est le suivant:
/ * Fichier source: ex1.cs démarre * /
Utilisation de System.Web;
Dlltenst de l'espace de noms
{{
/ *
La classe doit implémenter l'interface ihttphandler. Si le programme accédera à l'état de la session, l'interface IrequireSSessionState doit être implémentée (l'interface de marqueur qui n'inclut aucune méthode).
* /
Classe publique Ex1Page: ihttphandler
{{
/ *
L'attribut isreusable indique au .NET Framework que ce programme peut être utilisé par plusieurs threads en même temps.
Vrai correspond à la question de savoir si le faux correspond.
* /
Bool public isreusable
{{
obtenir {return true;}
}
/ *
Implémentez la méthode ProcessRequest et renvoyez les données de réponse au client.
Dans cet exemple, renvoyez une page HTML simple au client
* /
Public void processRequest (contexte httpcontext)
{{
httpResponse res = context.Response;
res.write (<html> <body>);
res.write (<h1> dlltest -ex1 (exemple 1) </h1> <hr>);
Res.write (cette page est gérée directement par DLL);
res.write (</html> </ body>);
}
}
}
/ * Fichier source: EX1.cs end * /
Dans l'état de la ligne de commande, les commandes de compilation suivantes compilent ex1.cs dans ex1.dll et la stockent dans le répertoire du bac.
CSC / T: bibliothèque /oxin/ex1.dll ex1.cs
Ajoutez un mappage ASPX-> DLL dans le fichier de configuration web.config.
<?
<Iconguration>
<system.web>
<httphandler>
<Ded verb = * path = dlltest1.aspx type = dlltest.ex1page, ex1 />
</ httphandler>
</sSystem.web>
</FIGIGURATION>
Maintenant, lorsque le navigateur visite http: //localhost/dlltest/dlltest1.aspx, il s'agit en fait de la méthode ProcessressRequest de la classe dlltest.ex1page dans ex1.dll.
Troisièmement, compilez un seul fichier ASPX dans DLL
À en juger par la «signification en dehors de Microsoft» décrite publiquement dans la section précédente, Microsoft ne prend pas en charge les développeurs de compiler directement les fichiers ASPX dans DLL. Cependant, la technologie ASP.NET Advanced Interface (Contrôle HTML du serveur, Contrôle Web, etc.) doit être affiché via le fichier ASPX. . de.
Maintenant, calmez-vous pour analyser:
Le compilateur CSC est juste un compilateur de langage C #. fichier source.
Par conséquent, afin de compiler le fichier ASPX dans un fichier DLL, le fichier ASPX doit être converti en un fichier source CS qui peut être reconnu par le compilateur CSC. Alors, quels outils sont utilisés pour convertir? Bien que je crois que cet outil doit être caché dans le framework .nt, j'ai vérifié un grand nombre de documents publics ASP.NET et .NET et de manuels de référence.
Oh, il n'y a aucun moyen vers le monde, et une opportunité accidentelle me fait toujours découvrir ce secret.
Jetez un œil au fichier source ex2.aspx:
/ * Fichier source: ex2.aspx start * /
<% @ Page Language = C #%>
<script runat = server>
/ *
Vous avez bien lu, la ligne suivante est "ABCDEFG".
Dans le texte, j'appelle cette ligne "Trap de code"
* /
ABCDEFG // CODE TRAP
void page_load (objet SRC, EventArgs Args)
{{
if (! IsPostback) notLabel.Text = Veuillez saisir votre nom:;
}
void OnNamesUbmit (objet SRC, EventArgs Args)
{{
String name = f_name.value;
notLabel.Text = (name ==)? Accueillir! ;;
}
</cript>
<html>
<body>
<Form runat = server>
<h1> dlltest -ex2 (exemple 2) </h1>
<hr>
<ASP: Label Runat = Server ID = NotLabel Style = Color: Red;
<input runat = server id = f_name size = 8>
<Button runat = server onserverclick = onNamesubmit> ok </futton>
</ form>
</docy>
</html>
/ * Fichier source: EX2.aspx end * /
Si le «Trap de code» commente ou supprime, alors ex2.aspx est un fichier ASP.net simple.
Ordons maintenant le "piège" et voyons ce que l'ASP.NET a renvoyé?
Renvoyé une page "Erreur de compilation" et les fichiers source du rapport ne peuvent pas être compilés. Ce qui est intéressant à être intéressé, c'est l'hyperlien appelé "Afficher la source de compilation complète" en bas de la page. Supprimez cette partie de la "source de compilation complète" et supprimez les informations précédentes du numéro de ligne et quelques autres commutateurs de compilation (principalement des commandes de compilation #line) et fermez le "piège de code" mignon, il supprime également), et après avoir terminé, enregistrez-le en tant que Ex2_ASPX .cs:
/ * Fichier source: ex2_aspx.cs Démarrer * /
/ *
À partir de la description ci-dessous, on peut voir qu'il existe en effet un outil ininterrompu pour compléter le fichier ASPX de conversion en un fichier source CS
* /
// ------------------------------------------------ -------------------------------------------------- -------------------------------------------------- ----------------- --------------------------------- -------------------------------------------
// <émutogener>
// Ce code a également été généré par A.
// Version d'exécution: 1.0.3705.0
//
// Les chinges à ce fichier peuvent se soucier d'un comportement incorrect et seront perdus si
// Le code est régénéré.
// </ autogenatre>
// ------------------------------------------------ -------------------------------------------------- -------------------------------------------------- ----------------- --------------------------------- -------------------------------------------
/ *
Étrangement: l'espace de dénomination est en fait ASP au lieu d'Aspx
Il est recommandé de changer le nom en nom adapté aux applications pour empêcher les conflits de dénomination, par exemple pour cet article, vous pouvez passer à DLLTEST
Je n'ai pas changé ici pour laisser tout le monde voir son apparence d'origine
* /
espace de noms asp {
Utilisation du système;
Utilisation de System.Collections;
Utilisation de System.Collections. spécialized;
Utilisation de System.Configuration;
Utilisation de System.Text;
Utilisation de System.Text.RegulArExPressions;
Utilisation de System.Web;
Utilisation de System.Web.caching;
Utilisation de System.Web.SessionState;
Utilisation de System.Web.Security;
Utilisation de System.Web.UI;
Utilisation de System.Web.Ui.WebControls;
Utilisation de System.Web.Ui.htmlControls;
/ *
1. Faites attention à la composition du nom de la classe.
2. Faites attention à sa classe de base. System.Web.UI.Page implémente l'interface Ihttphandler.
* /
classe publique ex2_aspx: System.web.ui.page, System.Web.SessionState.ireQuireSsenerationState {
Intratique statique privée Int __AutoHandler;
System protégé.web.ui.webControls.Label NoteLabel;
System protégé.web.ui.htmlcontrols.htmlinputText f_name;
System protégé.web.ui.htmlcontrols.htmlButton __Control3;
System protégé.web.ui.htmlcontrols.htmlform __Control2;
Bool statique privé __intialisé = false;
Système statique privé.Collections.ArrayList __FileDestendces;
/ * Maintenant, vous pouvez désactiver le "piège" * /
// ABCDEFG
void page_load (objet SRC, EventArgs Args)
{{
if (! IsPostback) notLabel.Text = Veuillez saisir votre nom:;
}
void OnNamesUbmit (objet SRC, EventArgs Args)
{{
String name = f_name.value;
notLabel.Text = (name ==)? Accueillir! ;;
}
/ * Fonction de construction * /
public ex2_aspx () {
System.Collections.ArrayList dépendances;
if (asp.ex2_aspx .__ Intialize == false) {{
dépendances = new System.collection.ArrayList ();
/ *
Les lignes suivantes doivent être annotées afin que la DLL devienne un fichier indépendant indépendant
Empêcher les nouveaux et anciens de ses fichiers "dépendance" lorsque la DLL s'exécute
* /
//Dependcesnces.add (w: //wwwroot/dlltest/ex2.aspx);
asp.ex2_aspx .__ FileDependces = dépendances;
asp.ex2_aspx .__ Intialized = true;
}
}
Override protégé int autohandler {
obtenir {
Return asp.ex2_aspx .__ AutoHandler;
}
ensemble {
asp.ex2_aspx ._ AutoHandlers = valeur;
}
}
System protégé.web.httpage ApplicationInstance {
obtenir {
Return ((system.web.httpapplication) (this.context.applicationInstance));
}
}
Modèles de chaîne de remplacement public
obtenir {
Return / dlltest;
}
}
System privé.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.IattbutAccessor) (__ Ctrl).
Retour __ctrl;
}
System privé.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;
Retour __ctrl;
}
System privé.web.ui.control __buildControl__Control3 () {{)
System.Web.Ui.htmlControls.htmlbutton __ctrl;
__ctrl = new System.Web.Ui.htmlControls.htmlButton ();
ce .__ Control3 = __ctrl;
System.Web.Ui.iparserAccessor __Parser = (System.Web.Ui.iparserAccessor) (__ctrl));
__PARSER.ADDPARSEDSUBOBOBJECT (new System.Web.Ui.LiteralControl (OK));
__Ctrl.ServerClick + = new System.EventHandler (this.onNameSubmit);
Retour __ctrl;
}
System privé.web.ui.control
System.Web.Ui.htmlControls.htmlform __ctrl;
__ctrl = new System.Web.Ui.htmlControls.htmlform ();
ce .__ Control2 = __ctrl;
System.Web.Ui.iparserAccessor __Parser = (System.Web.Ui.iparserAccessor) (__ctrl));
__PARSER.ADDPARSEDSUBOBOBJECT (new System.Web.Ui.LiteralControl (/ R / N <H1> DllTest -ex2 (Exemple 2) </H1> / R / N <HR> / R / N)))
Ce .__ buildControlNoteLabel ();
__PARSER.ADDPARSEDSUBOBJECT (this.NoteLabel);
__PARSER.ADDPARSEDSUBOBSIR (new System.Web.Ui.LiteralControl (/ R / N));
this .__ buildControltolf_name ();
__PARSER.ADDPARSEDSUBObject (this.f_name);
__PARSER.ADDPARSEDSUBOBSIR (new System.Web.Ui.LiteralControl (/ R / N));
this .__ buildControl__Control3 ();
__PARSER.ADDPARSEDSUBObject (This .___ Control3);
__PARSER.ADDPARSEDSUBOBSIR (new System.Web.Ui.LiteralControl (/ R / N));
Retour __ctrl;
}
Private void __buildControltree (System.web.ui.Control __ctrl) {
System.Web.Ui.iparserAccessor __Parser = (System.Web.Ui.iparserAccessor) (__ctrl));
__PARSER.ADDPARSEDSUBOBOBJECT (new System.Web.Ui.LiteralControl (/ R / N / R / N <Html> / R / N << Body> / R / N));
this .__ buildControl__Control2 ();
__Parser.AddParsedSubObject (This .___ Control2);
__PARSER.ADDPARSEDSUBOBOBJECT (New System.Web.Ui.literalControl
}
Protégé de substitution de remplacement void FramewInitialize () {
this .__ buildControltree (this);
this.filedEstences = asp.ex2_aspx .__ FileSestendces;
this.enableViewStateMac = true;
}
public Override int getTypeHashCode () {) {)
Retour -11574299;
}
}
}
/ * Fichier source: ex2_aspx.cs end * /
Je crois qu'après avoir analysé ce fichier, vous aurez une compréhension supplémentaire du principe de l'opération ASP.NET (n'aurez rien à voir avec cet article, déraisonnable).
Dans l'état de la ligne de commande, les commandes de compilation suivantes compilent ex2_aspx.cs dans ex2.dll et le stockent dans le répertoire bin.
CSC / T: bibliothèque /oxin/ex2.dll ex2_aspx.cs
Ajoutez un mappage ASPX-> DLL dans le fichier de configuration web.config, c'est-à-dire ajouter les lignes suivantes dans Httphandlers dans la section System.Web:
<Derb = * path = dlltest2.aspx type = asp.ex2_aspx, ex2 />
Maintenant, lorsque le navigateur visite http: //localhost/dlltest/dlltest2.aspx, c'est comme accéder à ex2.aspx. Bien sûr, même si Ex2.aspx n'existe pas ou qu'il a été mis à jour, il n'aura aucun impact sur l'accès à la page, à moins que BIN / EX2.DLL ne soit généré.
Quatrièmement, compilez le fichier ASPX de CodeBehind dans DLL
Pour compiler le fichier ASPX de CodeBehind en DLL, le principe de convertissement du fichier ASPX en un fichier source CS est le même que ci-dessus. en tant que fichier source CS. La différence est les étapes lorsqu'elles sont compilées en DLL: (pour plus de commodité du récit, en supposant que le fichier d'interface est ex3.aspx, le fichier CodeBehind est ex3.aspx.cs et la "source de compilation complète" d'EX3.aspx est stockée comme ex3_aspx.cs))
Étape 1: Utilisez d'abord la commande suivante pour compiler ex3.aspx.cs dans bin / ex3.aspx.cs.dll
CSC / T: bibliothèque /oxin/ex3.aspx.cs.dll ex3.aspx.cs
Étape 2: Utilisez la commande suivante pour compiler ex3_aspx.cs dans bin / ex3.dll
Csc / t: bibliothèque /r:bin/ex3.aspx.cs.dll /out:bin/ex3.dll ex3_aspx.cs
Ensuite, ajoutez ASPX-> Mappage DLL dans le fichier de configuration web.config, c'est-à-dire ajouter les lignes suivantes dans httphandlers dans la section System.web:
<add verb = * path = dlltest3.aspx type = asp.ex3_aspx, ex3 />
Ouvrez maintenant le navigateur et visitez http: //localhost/dlltest/dlltest3.aspx.
Cinq, un petit truc
Lors de la définition du «TRAP» pour convertir le fichier ASPX en un fichier source CS, utilisez généralement la méthode de copie et de collecte pour enregistrer la «source de compilation complète» dans le bloc-notes ou Vs.net ou un autre environnement de développement ASP.NET, puis enregistrez Il après avoir terminé la préservation des fichiers source CS.
L'organisation consiste à supprimer les informations du numéro de ligne de la pâte et de l'instruction de compilation "#line". Si ces informations sont supprimées manuellement, elles seront trop gênantes.
L'une des astuces que j'utilise est: dans le cahier, utilisez la méthode de remplacement pour organiser rapidement. Utiliser / * Ligne pour remplacer toutes les lignes, utilisez: * / pour remplacer tout:, utilisez // #line lignes pour remplacer tous , Définissez les paramètres de la fonction du constructeur principal Les phrases des "fichiers de dépendance" sont annotées, donc même si la finition est terminée.