Registriertes Mitglied, erstellen Sie Ihre Webentwicklungsdatenbank, Vorwort
ASP.NET ist kein einfaches Upgrade von ASP, sondern ein wichtiger Teil des Microsoft .NET -Planes. Die Fensterprogrammierung von Windows bietet eine gute Programmierschnittstelle für die Entwicklung großer Netzwerkanwendungsfunktionen und kann die Arbeitseffizienz von Entwicklern erheblich verbessern.
Der Prozess "One -Time Conversion, Two Compilations" lässt die ASPX -Datei jedoch bei der ersten Ausführung (oder der ersten Operation nach dem Update) etwas unzureichend erscheinen, insbesondere in der Anwendungsumgebung einer großen Anzahl von ASPX- und Codehind -Code -Dateien, Compile Die ASPX -Dateikompilierung wird nach DLL (im .NET, bezeichnet als Anwendungssatz) veröffentlicht, wodurch die Zeit "One Conversion, One Compilation" und die CPU -Nutzungsrate beseitigt wird, die die Gesamtleistung von Webdiensten erheblich verbessern wird. Natürlich hat sich die Vertraulichkeit des Quellcodes nach der Zusammenstellung in DLL auch bis zu einem gewissen Grad verbessert.
In diesem Artikel wird der grundlegende Verarbeitungsprozess von ASP.NET und eine Analyse einer geheimen Entdeckung eingeführt. "" Trap ", kompiliert die verfügbaren ASPX -Dateien mit der ASPX -Datei von CodeBehind in den DLL -Prozess. Am Ende des Artikels werden auch Tipps für den tatsächlichen Betriebsprozess eingeführt.
Da dieser Artikel die Konzepte wie ASP.NET -Anwendungen, Befehlszeilenkompilierung, Web.config -Konfigurationsdateien usw. umfasst, um den Lesern zu ermöglichen, den Inhalt dieses Artikels besser zu verstehen und diesen Artikel nicht mehr zu sammeln. Zunächst entspricht der diesem Artikel entsprechende Systeme dem entsprechenden System dieses Artikels.
Systemumgebung:
Win2000 (SP3) + IIS5 + .NET Framework 1.0 (chinesische Version).
Servername:
Da die Beispiele dieses Artikels auf dieser Maschine getestet werden, ist der Servername Localhost.
IIS -Einstellungen:
Richten Sie ein virtuelles Verzeichnis dltest (der reale Pfad ist W:/wwwroot/dlltest) und setzen Sie es als Anwendung, um ein Bin -Verzeichnis unter DllTest zu erstellen. Alle Quelldateien werden in das DllTest -Verzeichnis platziert, und alle DLL -Dateien werden im Verzeichnis dllTest/Bin platziert.
ASP.NET -Anwendungskonfigurationsdatei -Web.config
Erstellen Sie eine Web.config -Datei im DLLTEST -Verzeichnis.
<XML Version = 1.0?>
<Configuration>
<System.Web />
</Konfiguration>
Befehlsfenster (DOS -Fenster)
Öffnen Sie das Befehlsfenster und verwenden Sie den Befehl cd, um das aktuelle Verzeichnis als w:/wwwroot/dlltest zu erstellen.
1. Erstellen Sie eine Zuordnung von ASPX zu DLL
Lassen Sie uns zunächst sehen, wie die ASPX -Datei von ASP.NET verarbeitet wird:
Wenn eine HTTP -Anfrage (z. Verwenden Sie die ASPX -Seite sofort die ASPX -Seite. WebApp/webpaage.aspx "existiert. Wenn es nicht vorhanden ist, kehren Sie zum Client zurück und kehren Sie zu HTTP 404 -Fehler zurück (Datei nicht gefunden), andernfalls finden Sie die entsprechende DLL -Datei im temporären Verzeichnis von ASP.NET, wenn sie nicht vorhanden ist oder die DLL ist "alt" als die ASPX -Quelldatei, rufen Sie den CSC -Compiler auf (wenn das ASPX -Dienstskript des Service -Seitungsskripts des ASPX die Sprache VB oder JScript ist, und ruft dann den entsprechenden VBC -Compiler, JSC -Compiler) zum Kompilieren auf Die ASPX -Datei in DLL und dann fordert ASP.NET die DLL auf, um bestimmte Kundenanforderungen zu verarbeiten und zur Serverantwort zurückzukehren.
Aus diesem Verarbeitungsprozess ist die Betriebsumgebung von ASP.NET im Allgemeinen automatisch identifiziert, überprüft und aktualisiert die DLL, die ASPX entspricht. Gibt es also eine andere Möglichkeit, die Verarbeitung der "Route" einer ASPX -Datei zu einer kompilierten DLL zu erzwingen? Die Methode besteht darin, DLL -Mapping -Elemente im Abschnitt HTTPHandlers im Abschnitt HTTPHANDLERS im Abschnitt "WEB im Abschnitt HTTPHANDLERS" hinzuzufügen.
<dd verb =* path = Aspx -Dateiname Type = Klasse Name, DLL -Datei/>
ASPX -Datei: Der virtuelle Name des "Routing" ist erforderlich, und die Erweiterung muss ASPX sein, andernfalls verarbeitet IIS die Datei zuerst in der ASP.NET -Umgebung.
DLL -Datei: DLL -Datei (Anwendungssatz) Name, keine Eingabe ".dll". ASP.NET sucht zunächst die Montage -DLL in der Anwendung der Anwendung für die Anwendung der Anwendung und dann die Montage -DLL im System Set -Cache -Cache.
Klassenname: Da eine DLL möglicherweise mehrere Namen oder mehrere Klassen enthält, muss die Klasse automatisch geladen werden, wenn DLL aufruft.
Beispielsweise lautet die Web.config -Datei einer bestimmten ASP.NET -Anwendung wie folgt:
<XML Version = 1.0?>
<Configuration>
<System.Web>
<httphandler>
<dd verb =* path = index.aspx type = bbs.indexpage, bbs />
</httphandler>
</System.Web>
</Konfiguration>
In der Konfigurationsdatei wird ASP.NET mitgeteilt, dass, wenn der Client die Index.aspx -Datei dieser Anwendung anfordert, die bbs.dll im Anwendungs -Bin -Verzeichnis direkt aufruft und die BBS.Indexpage -Klasse automatisch lädt.
2. Die Entwicklung kann die DLL der HTML -Seite verarbeiten
Es sollte darauf hingewiesen werden, dass nicht alle Anwendungen DLL den HTTP -Anforderungs-/Antwortmodus implementieren können. Schauen wir uns die Beschreibung des "HTTP -Verarbeitungsprogramms und der Fabrik" im Microsoft ASP.Net Fast -Eintrags -Tutorial (http://chs.gotdotnet.com/quickstart/aspplus/) an:
ASP.NET bietet Anfragen/Antwort -APIs mit niedrigem Level und ermöglicht Entwicklern, die .NET -Framework -Klasse zu verwenden, um Dienste für Einführung von HTTP -Anfragen bereitzustellen. Zu diesem Zweck müssen Entwickler eine Klasse erstellen, die System unterstützt. Bei der Bearbeitung der HTTP -Anfrage ist der vom Rahmen mit hohen Seiten bereitgestellte Service nicht erforderlich, das Verarbeitungsprogramm ist normalerweise nützlich. Zu den gemeinsamen Verwendungen von Verarbeitungsprogrammen gehören Screenters und Anwendungen, die CGI ähneln, insbesondere die Anwendungen, die binäre Daten zurückgeben.
Jede Anforderung aus der von ASP.NET empfangenen HTTP -Anforderung wird schließlich von einer bestimmten Instanz der Klasse behandelt, die IHTTPHandler implementiert. IHTTPHandlerFactory bietet eine Struktur, die die tatsächliche Analyse der IHTTPHandler -Instanz -URL -Anfrage verarbeitet. Zusätzlich zu der von ASP.NET bereitgestellten Standardklasse IHTTPHandlerFactory können Entwickler auch Fabriken erstellen und registrieren, um eine große Anzahl von Anfraganalyse- und Aktivierungslösungen zu unterstützen.
Aus diesem Text ist ersichtlich, dass, wenn die ASPX -Seite nicht die vom .NET -Framework bereitgestellte erweiterte Schnittstellentechnologie (z. B. Datencache, Statusbehalten, Webfensterreferenz usw.), insbesondere bei der Rückgabe von Binärdaten (solches Als Bilder, Sounds usw.) für den Client können Sie eine .cs -Anwendungsdatei (mit C# -Sprache hier verwenden, wenn Sie VB oder JScript, ...) und die Anwendung, die das Programm über eine Klasse verfügt, um zu implementieren. System.Web.Ihttphandler -Schnittstelle und implementieren Sie die processRequest () -Methode. Ein einfaches Beispiel ist wie folgt:
/* Quelldatei: EX1.cs startet*/
mit System.Web;
Namespace dlltenst
{{{{
/*
Die Klasse muss die IHTTPandler -Schnittstelle implementieren. Wenn das Programm auf den Sitzungsstatus zugreift, muss die Schnittstelle zwischen IrequiresSessionState implementiert werden (die Markierungsschnittstelle, die keine Methode enthält).
*/
Öffentliche Klasse Ex1page: IHTTPandler
{{{{
/*
Das IsReusable -Attribut gibt dem .NET -Framework mit, dass dieses Programm gleichzeitig von mehreren Threads verwendet werden kann.
True entspricht, ob das falsche entspricht.
*/
Öffentlich bool isreusable
{{{{
Holen Sie sich {return true;}
}
/*
Implementieren Sie die ProcessRequest -Methode und geben Sie die Antwortdaten an den Client zurück.
Geben Sie in diesem Beispiel eine einfache HTML -Seite an den Client zurück
*/
Public void processRequest (HTTPContext -Kontext)
{{{{
httpresponse res = context.Response;
res.write (<html> <body>);
res.write (<h1> dlltest -ex1 (Beispiel 1) </h1> <hr>);
Res.write (diese Seite wird direkt von DLL behandelt);
res.write (</html> </body>);
}
}
}
/* Quelldatei: ex1.cs End*/
Im Befehlszeilenstatus kompilieren die folgenden Kompilierungsbefehle Ex1.cs in Ex1.dll und speichern sie im Bin -Verzeichnis.
CSC /T: Bibliothek /oxin/ex1.dll ex1.cs
Fügen Sie der Konfigurationsdatei Web.config hinzu.
<XML Version = 1.0?>
<Configuration>
<System.Web>
<httphandler>
<Ded verb =* path = dlltest1.aspx type = dlltest.ex1page, ex1 />
</httphandler>
</System.Web>
</Konfiguration>
Wenn der Browser nun http: //localhost/dlltest/dlltest1.aspx besucht, ist es tatsächlich die processRequest -Methode von DllTest.ex1Page -Klasse in ex1.dll.
Drittens kompilieren Sie eine einzelne ASPX -Datei in DLL
Nach der "Bedeutung außerhalb von Microsoft", die im vorherigen Abschnitt öffentlich beschrieben wurde, unterstützt Microsoft die Entwickler nicht, ASPX -Dateien direkt in DLL zu kompilieren. ASP.NET Advanced Interface Technology (Server HTML Control, Web Control usw.) muss jedoch über die ASPX -Datei angezeigt werden. . von.
Jetzt beruhige dich, um zu analysieren:
Der CSC -Compiler ist nur ein C#-sprachkompiler. Quelldatei.
Um die ASPX -Datei in eine DLL -Datei zu kompilieren, muss die ASPX -Datei daher in eine CS -Quelldatei konvertiert werden, die vom CSC -Compiler erkannt werden kann. Welche Tools werden zum Konvertieren verwendet? Obwohl ich glaube, dass dieses Tool in .nt -Framework versteckt sein muss, habe ich eine große Anzahl von ASP.NET- und .NET -öffentlichen Dokumenten und Referenzhandbüchern überprüft.
Oh, es gibt keine Möglichkeit zur Welt, und eine zufällige Gelegenheit lässt mich dieses Geheimnis immer noch entdecken.
Schauen Sie sich die Quelldatei Ex2.aspx an:
/* Quelldatei: ex2.aspx start*/
< %@ Page Language = C# %>
<script runat = server>
/*
Sie lesen es richtig, die nächste Zeile ist "Abcdefg".
Im Text nenne ich diese Zeile "Codefalle"
*/
ABCDEFG // Codefalle
void page_load (Objekt SRC, EventArgs Args)
{{{{
if (! isPostback) Notlabel.Text = Bitte geben Sie Ihren Namen ein:;
}
void onnamesubmit (Objekt SRC, EventArgs Args)
{{{{
String name = f_name.value;
Notlabel.Text = (Name ==)? Willkommen! ;;
}
</script>
<html>
<body>
<Formular Runat = Server>
<h1> dlltest -ex2 (Beispiel 2) </h1>
<hr>
<ASP: Label Runat = Server ID = Notlabel Style = Color: Rot;
<Eingabe runat = server id = f_name size = 8>
<Button runat = server onserverclick = onnamesubmit> OK </button>
</form>
</body>
</html>
/* Quelldatei: Ex2.aspx End*/
Wenn die "Code -Trap" kommentiert oder löscht, ist Ex2.aspx eine einfache ASP.NET -Datei.
Öffnen wir nun die "Falle" und sehen, was der ASP.NET zurückgegeben hat?
Zurückgegeben eine "Kompilierungsfehler" -Seite, und die Berichtsquellendateien können nicht kompiliert werden. Interessant ist der Hyperlink mit dem Namen "Die vollständige Kompilierungsquelle anzeigen" am Ende der Seite. Entfernen Sie diesen Teil der "vollständigen Kompilierungsquelle" und entfernen Sie die vorherigen Zeilennummerninformationen und einige andere Kompilierungsschalter (hauptsächlich #Line Compile -Befehle) und schließen Sie die niedliche "Codefalle", die auch löscht). .cs:
/* Quelldatei: ex2_aspx.cs starten*/
/*
Aus der folgenden Beschreibung ist ersichtlich, dass es tatsächlich ein ununterbrochenes Tool gibt, um die konvertierende ASPX -Datei in eine CS -Quelldatei zu vervollständigen
*/
// -------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------ --------------------------------- -------------------------------------------
// <emutogenerate>
// Dieser Code wurde auch von einem generiert.
// Laufzeitversion: 1.0.3705.0
//
// Chinges in diese Datei kann ein falsches Verhalten kümmern und wird verloren gehen, wenn
// Der Code wird regeneriert.
// </autogenerate>
// -------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------ --------------------------------- -------------------------------------------
/*
Seltsamerweise: Das Benennung von Raum ist tatsächlich ASP anstelle von ASPX
Es wird empfohlen, den Namen in den für Anträge geeigneten Namen zu ändern, um Konflikte zu verhindern, z. B. für diesen Artikel, Sie können in DllTest ändern
Ich habe mich hier nicht geändert, damit alle sein ursprüngliches Erscheinungsbild sehen lassen
*/
Namespace ASP {
mit System verwenden;
mit System.Collections;
Mit System.Collections.Specialized;
mit System.Configuration;
mit System.text;
Mit System.Text.regularexpressions;
mit System.Web;
mit System.web.caching;
mit System.Web.SessionState;
Mit System.Web.Security;
mit System.web.ui;
Verwenden von System.Web.Ui.Webcontrols;
mit System.web.ui.htmlControls;
/*
1. Achten Sie auf die Komposition des Klassennamens.
2. Achten Sie auf seine Basisklasse. System.web.ui.page implementiert die IHTTPandler -Schnittstelle.
*/
public class ex2_aspx: system.web.ui.page, System.web.sessionState.irequiressenerationState {
Private statische int __autohandler;
Protected System.Web.Ui.Webcontrols.label Notelabel;
Protected System.Web.Ui.htmlControls.htmlinputText f_name;
Protected System.Web.Ui.htmlControls.htmlbutton __Control3;
Protected System.Web.Ui.htmlControls.htmlform __control2;
Private static bool __intialisiert = false;
Private statische System.Collections.ArrayList __FileDependenzen;
/* Jetzt können Sie die "Falle" ausschalten*/
// abcdefg
void page_load (Objekt SRC, EventArgs Args)
{{{{
if (! isPostback) Notlabel.Text = Bitte geben Sie Ihren Namen ein:;
}
void onnamesubmit (Objekt SRC, EventArgs Args)
{{{{
String name = f_name.value;
Notlabel.Text = (Name ==)? Willkommen! ;;
}
/* Konstruktionsfunktion*/
public ex2_aspx () {
System.Collections.ArrayList -Abhängigkeiten;
if (asp.ex2_aspx .__ intialize == false) {{{{{
Abhängigkeiten = neues System.Collections.ArrayList ();
/*
Die folgenden Zeilen sollten kommentiert werden, damit DLL zu einer unabhängigen unabhängigen Datei wird
Verhindern Sie die neuen und alten seiner "Abhängigkeits" -Dateien, wenn die DLL ausgeführt wird
*/
//Dependencies.add (w: //wwwroot/dlltest/ex2.aspx);
ASP.Ex2_aspx .__ agedependencies = Abhängigkeiten;
ASP.Ex2_aspx .__ intialized = true;
}
}
Protected Override Int Autohandler {
erhalten {
Return ASP.ex2_aspx .__ AutoHandler;
}
Satz {
ASP.ex2_aspx ._ autohandlers = value;
}
}
Protected System.Web.httpage ApplicationInstance {
erhalten {
Return ((system.web.htttpapplication) (this.context.applicationInstance));
}
}
Public Override String templateSourcedirectory {
erhalten {
Return /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) (__ Strg).
Return __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;
Return __ctrl;
}
Private System.Web.Ui.Control __buildControl__Control3 () {{{)
System.Web.Ui.htmlControls.htmlbutton __ctrl;
__ctrl = new System.web.ui.htmlcontrols.htmlbutton ();
this .__ control3 = __ctrl;
System.Web.Ui.IparserAccessor __parser = (System.Web.Ui.IparserAccessor) (__ctrl));
__parser.addParsedSubObject (neues System.Web.Ui.Litereralcontrol (OK));
__Ctrl.serverclick += new System.EventHandler (this.onnamesubmit);
Return __ctrl;
}
Private System.Web.Ui.Control
System.Web.Ui.htmlControls.htmlform __ctrl;
__ctrl = new System.web.ui.htmlControls.htmlform ();
this .__ control2 = __ctrl;
System.Web.Ui.IparserAccessor __parser = (System.Web.Ui.IparserAccessor) (__ctrl));
__Parser.addparsedSubObject (neues System.Web.Ui.Litereralcontrol (/r/n <h1> dltest -ex2 (Beispiel 2) </h1>/r/n <hr>/r/n)))
Dies .__ BuildControlnotelabel ();
__parser.addParsedSubObject (this.notelabel);
__Parser.addParsedSubObject (neues System.Web.Ui.Litereralcontrol (/r/n));
this .__ BuildControlf_Name ();
__parser.addParsedSubObject (this.f_name);
__Parser.addParsedSubObject (neues System.Web.Ui.Litereralcontrol (/r/n));
Dies .__ BuildControl__Control3 ();
__Parser.addParsedSubObject (this .___ control3);
__Parser.addParsedSubObject (neues System.Web.Ui.Litereralcontrol (/r/n));
Return __ctrl;
}
Private void __buildControlTree (System.Web.Ui.Control __ctrl) {
System.Web.Ui.IparserAccessor __parser = (System.Web.Ui.IparserAccessor) (__ctrl));
__Parser.addparsedSubObject (neues System.Web.Ui.LitereralControl (/r/n/r/n <html>/r/n <body>/r/n));
Dies .__ BuildControl__Control2 ();
__Parser.addParsedSubObject (this .___ control2);
__Parser.addparsedSubObject (neues System.Web.Ui.Litereralcontrol
}
Protected Override void FrameworkInitialize () {
dies .__ BuildControlTree (dies);
this.FileDependenzen = ASP.Ex2_aspx .__ agedependencies;
this.EnableViewStatemac = true;
}
public override int gettTypeHashCode () {) {)
Rückgabe -11574299;
}
}
}
/* Quelldatei: ex2_aspx.cs end*/
Ich glaube, dass Sie nach der Analyse dieser Datei ein weiteres Verständnis des Prinzips des ASP.NET -Betriebs haben (nichts mit diesem Artikel zu tun haben, unangemessen).
Im Befehlszeilenzustand werden die folgenden Kompilierungsbefehle ex2_aspx.cs in ex2.dll zusammenstellen und im Bin -Verzeichnis speichern.
CSC /T: Bibliothek /oxin/ex2.dll ex2_aspx.cs
Fügen Sie der Konfigurationsdatei web.config die ASPX-> DLL-Mapping hinzu, dh die folgenden Zeilen in httphandlers im System.Web Abschnitt:
<Derb =* path = dllTest2.aspx type = ASP.ex2_aspx, ex2 />
Wenn der Browser nun http: //localhost/dlltest/dlltest2.aspx besucht, ist es genau wie der Zugriff auf EX2.aspx. Selbst wenn EX2.aspx nicht vorhanden ist oder es aktualisiert wurde, wird es keinen Einfluss auf den Seitenzugriff haben, es sei denn, Bin/ex2.dll wird erneut geschlossen.
Viertens kompilieren Sie die ASPX -Datei des Codebehinds in DLL
Um die ASPX -Datei des Codebehinds in DLL zu kompilieren, ist das Prinzip der ASPX -Datei in eine CS -Quelldatei übereinstimmt wie oben. Als CS -Quelldatei. Der Unterschied sind die Schritte, wenn sie in DLL zusammengestellt werden: (Aus Gründen der Erzählung, vorausgesetzt, die Schnittstellendatei ist ex3.aspx, die CodeBehind -Datei ist ex3.aspx.cs und die "vollständige Kompilierungsquelle" von EX3.aspx wird als gespeichert als "vollständige Kompilierungsquelle" ex3_aspx.cs)))
Schritt 1: Verwenden Sie zunächst den folgenden Befehl, um ex3.aspx.cs in bin/ex3.aspx.cs.dll zu kompilieren
CSC /T: Bibliothek /oxin/ex3.aspx.cs.dll ex3.aspx.cs
Schritt 2: Verwenden Sie den folgenden Befehl, um ex3_aspx.cs in bin/ex3.dll zu kompilieren
CSC /T: Bibliothek /r:bin/ex3.aspx.cs.dll /out:Bin/ex3.dll ex3_aspx.cs
Fügen Sie dann ASPX-> DLL Mapping zur Konfigurationsdatei Web.config hinzu, dh die folgenden Zeilen in httphandlers im System hinzu.
<add verb =* path = dllTest3.aspx type = ASP.Ex3_aspx, ex3 />
Öffnen Sie nun den Browser und besuchen Sie http: //localhost/dlltest/dlltest3.aspx.
Fünf, ein kleiner Trick
Wenn Sie die "Trap" so einstellen, dass die ASPX -Datei in eine CS -Quelldatei umwandelt wird, verwenden Sie im Allgemeinen die Methode Kopieren und Einfügen, um die "vollständige Kompilierungsquelle" im Notepad oder im vs.NET oder in einer anderen ASP.NET -Entwicklungsumgebung zu speichern und dann zu speichern, und dann speichern Nach Abschluss der Erhaltung für CS -Quelldateien.
Das Organisieren besteht darin, die Liniennummerninformationen der Paste und der Kompilierungsanweisung "#line" zu entfernen. Wenn diese Informationen manuell gelöscht werden, ist dies zu problematisch.
Einer der Tricks, die ich verwende, ist: Verwenden Sie im Notebook die Ersatzmethode, um sich schnell zu organisieren. Verwenden Sie/* Zeile, um alle Zeilen zu ersetzen, verwenden Sie:*/um alle zu ersetzen :, Verwenden Sie // #line -Zeilen, um alle #line zu ersetzen. Stellen Sie die Einstellungen der Hauptkonstruktorfunktion fest. Die Sätze von "Abhängigkeitsdateien" sind kommentiert. Auch wenn die Finishing abgeschlossen ist.