Anggota Terdaftar, Buat Database Pengembangan Web Anda, Kata Pengantar
ASP.NET bukanlah peningkatan ASP yang sederhana, tetapi bagian penting dari rencana Microsoft .NET. Ke pemrograman jendela Windows, menyediakan antarmuka pemrograman yang baik untuk pengembangan fungsi aplikasi jaringan besar, dan dapat sangat meningkatkan efisiensi kerja pengembang.
Namun, proses konversi "satu kali, dua kompilasi" membuat file ASPX tampak sedikit tidak memadai ketika eksekusi pertama (atau operasi pertama setelah pembaruan), terutama di lingkungan aplikasi sejumlah besar file kode ASPX dan kode, kompilasi, kompilasi Kompilasi file ASPX diterbitkan setelah DLL (di .net, yang dikenal sebagai set aplikasi), menghilangkan waktu "satu konversi, satu kompilasi" dan tingkat penggunaan CPU, yang akan sangat meningkatkan kinerja keseluruhan layanan web. Tentu saja, setelah dikompilasi ke dalam DLL, kerahasiaan kode sumber juga telah meningkat sampai batas tertentu.
Artikel ini memperkenalkan proses pemrosesan dasar ASP.NET dan analisis penemuan rahasia. "" Trap ", mengkompilasi file ASPX yang tersedia dengan file ASPX CodeBehind ke dalam proses DLL. Di akhir artikel, tips untuk proses operasi yang sebenarnya juga diperkenalkan.
Karena artikel ini melibatkan konsep -konsep seperti aplikasi ASP.NET, kompilasi baris perintah, file konfigurasi Web.config, dll., Untuk memungkinkan pembaca lebih memahami konten artikel ini, dan membuat artikel ini terlihat tidak lagi terakumulasi, Pertama -tama sistem yang sesuai dengan artikel ini, artikel ini sesuai dengan sistem yang sesuai dari artikel ini.
Lingkungan Sistem:
Win2000 (SP3) + IIS5 + .NET Framework 1.0 (Versi Cina).
Nama Server:
Karena contoh artikel ini diuji pada mesin ini, nama server adalah LocalHost.
Pengaturan IIS:
Tetapkan Dlltest DllTest Virtual (jalur yang sebenarnya adalah W:/WWWroot/Dlltest), dan atur sebagai aplikasi untuk membuat direktori bin di bawah DLLTest. Semua file sumber akan ditempatkan di direktori DLLTest, dan semua file DLL akan ditempatkan di direktori DLLTest/Bin.
Asp.net File Konfigurasi Aplikasi --web.config
Buat file Web.config di DllTest Directory.
<? Versi XML = 1.0?>
<Configuration>
<system.web />
</configuration>
Jendela perintah (jendela dos)
Buka jendela perintah dan gunakan perintah CD untuk membuat direktori saat ini sebagai w:/wwwroot/dlltest.
1. Buat pemetaan dari ASPX ke DLL
Pertama -tama, mari kita lihat bagaimana file ASPX diproses oleh ASP.NET:
Ketika permintaan HTTP (seperti "http: //webserver/webapp/webpage.aspx") dikirim dari klien ke server IIS, IIS menangkap dan menganalisis permintaan, dan ketika menganalisis permintaan ini sebagai halaman ASPX, segera segera Gunakan halaman ASPX untuk segera menggunakan halaman ASPX. Webapp/webpaage.aspx "ada. Jika tidak ada, kembali ke klien dan kembali ke http 404 (file tidak ditemukan) kesalahan, jika tidak temukan file DLL yang sesuai di direktori sementara ASP.NET, jika tidak ada Atau DLL adalah "lama" dari file sumber ASPX, hubungi kompiler CSC (jika skrip layanan ASPX dari skrip sisi layanan dari ASPX bahasa adalah VB atau JScript, kemudian memanggil kompiler VBC yang sesuai, kompiler JSC) untuk dikompilasi File ASPX ke DLL, dan kemudian ASP.NET memanggil DLL untuk menangani permintaan pelanggan tertentu dan kembali ke respons server.
Dapat dilihat dari proses pemrosesan ini. Secara umum, lingkungan operasi ASP.NET akan secara otomatis mengidentifikasi, memeriksa, dan memperbarui DLL yang sesuai dengan ASPX. Jadi adakah cara lain untuk memaksa pemrosesan "rute" ke file ASPX ke DLL yang dikompilasi? Metode ini adalah menambahkan aspx ke item pemetaan DLL di bagian httphandlers di bagian System.
<dd verb =* path = aspx nama file type = nama kelas, file dll/>
File ASPX: Nama virtual dari "routing" diperlukan, dan ekstensi harus ASPX, jika tidak IIS akan memproses file terlebih dahulu di lingkungan yang berjalan ASP.NET.
File DLL: File DLL (Set Aplikasi) Nama, tidak perlu memasukkan ".dll". Asp.net pertama -tama mencari DLL perakitan dalam aplikasi aplikasi untuk aplikasi aplikasi, dan kemudian mencari DLL perakitan dalam sistem set cache cache.
Nama kelas: Karena satu DLL mungkin memiliki beberapa nama atau beberapa kelas, kelas mana yang harus dimuat secara otomatis saat DLL panggilan.
Misalnya, file web.config dari aplikasi ASP.NET tertentu adalah sebagai berikut:
<? Versi XML = 1.0?>
<Configuration>
<system.web>
<httphandler>
<dd verb =* path = index.aspx type = bbs.indexpage, bbs />
</httphandler>
</ssystem.web>
</configuration>
File konfigurasi memberi tahu ASP.NET bahwa ketika klien meminta file index.aspx aplikasi ini, secara langsung memanggil bbs.dll di direktori bin aplikasi, dan secara otomatis memuat kelas BBS.IndExpage.
2. Pengembangan dapat menangani DLL halaman HTML
Harus ditunjukkan bahwa tidak semua aplikasi DLL dapat mengimplementasikan mode permintaan/respons HTTP. Mari kita lihat deskripsi "Program Pemrosesan dan Pabrik HTTP" di Microsoft Asp.net Tutorial Entri Cepat (http://chs.gotdotnet.com/quickstart/aspplus/):
ASP.NET menyediakan permintaan/API respons tingkat rendah, memungkinkan pengembang untuk menggunakan kelas .NET Framework untuk menyediakan layanan untuk permintaan HTTP yang diperkenalkan. Untuk tujuan ini, pengembang perlu membuat kelas yang mendukung antarmuka System.web.ihttphandler dan mengimplementasikan metode ProcessRequest (). Saat memproses permintaan HTTP tidak memerlukan layanan yang disediakan oleh kerangka halaman tingkat tinggi, program pemrosesan biasanya berguna. Penggunaan umum program pemrosesan termasuk screenters dan aplikasi yang mirip dengan CGI, terutama aplikasi yang mengembalikan data biner.
Setiap permintaan dari permintaan HTTP yang diterima oleh ASP.NET akhirnya ditangani oleh contoh tertentu dari kelas yang mengimplementasikan ihttphandler. IHTTPHANDLERFACTORY menyediakan struktur yang memproses analisis aktual dari permintaan URL instance ihttphandler. Selain kelas IHTTTPHANDLERFACTORY default yang disediakan oleh ASP.NET, pengembang juga dapat memilih untuk membuat dan mendaftarkan pabrik untuk mendukung sejumlah besar analisis permintaan dan solusi aktivasi.
Dapat dilihat dari teks ini bahwa ketika halaman ASPX tidak melibatkan teknologi antarmuka canggih yang disediakan oleh .NET Framework (seperti cache data, penyimpanan status, referensi kontrol jendela web, dll.), Terutama ketika mengembalikan data biner (seperti itu Sebagai gambar, suara, dll.) Untuk klien, Anda dapat menggunakan file aplikasi .cs (menggunakan bahasa C#di sini, jika Anda menggunakan VB atau JScript, ...), dan aplikasi program harus memiliki kelas untuk diimplementasikan System.web.ihttphandler Antarmuka dan mengimplementasikan metode ProcessRequest (). Contoh sederhana adalah sebagai berikut:
/* File sumber: Ex1.cs dimulai*/
menggunakan System.web;
Namespace Dlltenst
{{
/*
Kelas harus mengimplementasikan antarmuka ihttphandler. Jika program akan mengakses status sesi, antarmuka IrequiressiessionState harus diimplementasikan (antarmuka penanda yang tidak termasuk metode apa pun).
*/
Kelas Publik Ex1Page: IHTTPHANDLER
{{
/*
Atribut ISREUSable memberi tahu .NET Framework bahwa program ini dapat digunakan oleh banyak utas secara bersamaan.
True sesuai; apakah false sesuai.
*/
BOOL PUBLIK ISREUSABLE
{{
dapatkan {return true;}
}
/*
Terapkan metode ProcessRequest dan kembalikan data respons ke klien.
Dalam contoh ini, kembalikan halaman HTML sederhana ke klien
*/
Public Void ProcessRequest (konteks httpcontext)
{{
httpresponse res = context.response;
res.write (<html> <body>);
res.write (<h1> dlltest -ex1 (Contoh 1) </h1> <hr>);
Res.write (halaman ini ditangani langsung oleh DLL);
res.write (</html> </body>);
}
}
}
/* File Sumber: Ex1.cs End*/
Dalam keadaan baris perintah, Compile Command berikut mengkompilasi EX1.CS ke EX1.DLL dan menyimpannya di direktori bin.
CSC /T: library /oxin/ex1.dll ex1.cs
Tambahkan Aspx-> DLL Mapping ke file konfigurasi Web.config.
<? Versi XML = 1.0?>
<Configuration>
<system.web>
<httphandler>
<Ded verb =* path = dlltest1.aspx type = dlltest.ex1page, ex1 />
</httphandler>
</ssystem.web>
</configuration>
Sekarang ketika browser mengunjungi http: //localhost/dlltest/dlltest1.aspx, itu sebenarnya adalah metode ProcessressRequest dari kelas Dlltest.ex1Page di Ex1.dll.
Ketiga, kompilasi satu file ASPX ke dalam DLL
Menilai dari "makna di luar Microsoft" yang dijelaskan secara publik di bagian sebelumnya, Microsoft tidak mendukung pengembang untuk menyusun file ASPX langsung ke DLL. Namun, Asp.net Teknologi Antarmuka Lanjutan (Kontrol HTML Server, Kontrol Web, dll.) Perlu ditampilkan melalui file ASPX. . dari.
Sekarang tenang untuk menganalisis:
Kompiler CSC hanyalah kompiler bahasa C#. file sumber.
Oleh karena itu, untuk mengkompilasi file ASPX ke dalam file DLL, file ASPX harus dikonversi menjadi file sumber CS yang dapat dikenali oleh kompiler CSC. Jadi alat apa yang digunakan untuk mengonversi? Meskipun saya percaya bahwa alat ini harus disembunyikan dalam kerangka kerja, saya memeriksa sejumlah besar dokumen publik ASP.NET dan .NET dan manual referensi.
Oh, tidak ada cara bagi dunia, dan peluang yang tidak disengaja masih membuat saya menemukan rahasia ini.
Lihatlah file sumber ex2.aspx:
/* File sumber: ex2.aspx mulai*/
< %@ halaman bahasa = C# %>
<skrip runat = server>
/*
Anda membacanya dengan benar, baris berikutnya adalah "ABCDEFG".
Dalam teks, saya menyebut baris ini "perangkap kode"
*/
ABCDEFG // Kode Perangkap
void page_load (objek src, eventArgs args)
{{
if (! isPostBack) notlabel.text = Harap masukkan nama Anda:;
}
void onnamesubmit (Object SRC, EventArgs Args)
{{
string name = f_name.value;
notlabel.text = (name ==)? Selamat datang! ;;
}
</script>
<Html>
<body>
<Form runat = server>
<h1> dlltest -ex2 (Contoh 2) </h1>
<Hr>
<ASP: Label Runat = ID Server = NotLabel Style = Color: Red;
<input runat = server id = f_name size = 8>
<Tombol runat = server onServerClick = onNamesUbmit> ok </button>
</form>
</body>
</html>
/* File sumber: ex2.aspx end*/
Jika komentar "Code Trap", maka Ex2.aspx adalah file ASP.NET sederhana.
Sekarang mari kita buka "jebakan" dan lihat apa yang telah dikembalikan oleh ASP.NET?
Mengembalikan halaman "Kesalahan Kompilasi", dan file sumber laporan tidak dapat dikompilasi. Yang menarik untuk diminati adalah hyperlink yang disebut "Tampilkan Sumber Kompilasi Lengkap" di bagian bawah halaman. Hapus bagian ini dari "Sumber Kompilasi Lengkap" dan hapus informasi nomor baris sebelumnya dan beberapa sakelar kompilasi lainnya (terutama perintah kompilasi #line) dan tutup "perangkap kode" yang lucu juga), dan setelah finishing, simpan sebagai ex2_aspx .cs:
/* File sumber: ex2_aspx.cs mulai*/
/*
Dari deskripsi di bawah ini, dapat dilihat bahwa memang ada alat yang tidak terputus untuk melengkapi file ASPX yang mengonversi ke dalam file sumber CS
*/
// ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------- --------------------------------- -------------------------------------------
// <emputogenerate>
// Kode ini juga dihasilkan oleh A.
// Versi runtime: 1.0.3705.0
//
// chinges ke file ini mungkin peduli perilaku yang salah dan akan hilang jika
// Kode ini diregenerasi.
// </autogenerate>
// ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------- --------------------------------- -------------------------------------------
/*
Anehnya: ruang penamaan sebenarnya adalah ASP, bukan ASPX
Disarankan untuk mengubah nama menjadi nama yang cocok untuk aplikasi untuk mencegah penamaan konflik, seperti untuk artikel ini, Anda dapat mengubah ke DLLTest
Saya tidak berubah di sini untuk membiarkan semua orang melihat penampilan aslinya
*/
namespace asp {
menggunakan sistem;
menggunakan System.Collections;
Menggunakan System.Collections.Spesialisasi;
menggunakan System.configuration;
menggunakan System.Text;
Menggunakan System.Text.RegularExpressions;
menggunakan System.web;
menggunakan system.web.caching;
menggunakan System.Web.SessionState;
Menggunakan System.Web.Security;
menggunakan system.web.ui;
menggunakan system.web.ui.webControls;
menggunakan system.web.ui.htmlControls;
/*
1. Perhatikan komposisi nama kelas.
2. Perhatikan kelas dasarnya. System.web.ui.Page mengimplementasikan antarmuka IHTTPHANDLER.
*/
Public Class EX2_aspx: System.web.ui.page, System.Web.SessionState.irequiressenerationState {
Private Static Int __AutoHandler;
System yang Dilindungi.web.ui.webControls.label Notelabel;
System yang Dilindungi.web.ui.htmlControls.htmlinputText f_name;
System yang Dilindungi.web.ui.htmlControls.htmlbutton __control3;
System yang Dilindungi.web.ui.htmlControls.htmlform __control2;
Private Static Bool __intalized = false;
Sistem Statis Pribadi.Collections.Arraylist __fileDependencies;
/* Sekarang Anda dapat mematikan "jebakan"*/
// abcdefg
void page_load (objek src, eventArgs args)
{{
if (! isPostBack) notlabel.text = Harap masukkan nama Anda:;
}
void onnamesubmit (Object SRC, EventArgs Args)
{{
string name = f_name.value;
notlabel.text = (name ==)? Selamat datang! ;;
}
/* Fungsi konstruksi*/
PUBLIK EX2_ASPX () {
System.Collections.Arraylist dependensi;
if (asp.ex2_aspx .__ intialize == false) {{
dependensi = System.Collections.ArrayList () baru;
/*
Baris -baris berikut harus dijelaskan sehingga DLL menjadi file independen independen
Mencegah file "ketergantungan" yang baru dan lama saat DLL berjalan
*/
//Dependencies.add (w: //wwwroot/dlltest/ex2.aspx);
asp.ex2_aspx .__ fileDependencies = dependensi;
asp.ex2_aspx .__ intialized = true;
}
}
Override intride int autobhandler {
mendapatkan {
Return asp.ex2_aspx .__ AutoHandler;
}
mengatur {
asp.ex2_aspx ._ autoHandlers = value;
}
}
System Protected.web.httpage ApplicationInstance {
mendapatkan {
Return ((system.web.httpapplication) (this.context.applicationInstance));
}
}
Templating string override publik {
mendapatkan {
Return /Dlltest;
}
}
private system.web.ui.control __buildControlNotelabel () {
System.web.ui.webControls.label __ctrl;
__ctrl = sistem baru.web.ui.webControls.label ();
this.notlabel = __ctrl;
__Ctrl.id = notelabel;
(System.web.ui.iattributeAccessor) (__ Ctrl).
Mengembalikan __ctrl;
}
Private system.web.ui.control __buildcontrolf_name () {
System.web.ui.htmlControls.htmlinputText __ctrl;
__ctrl = System.web.Ui.htmlControls.htmlinPutText ();
this.f_name = __ctrl;
__ctrl.id = f_name;
__ctrl.size = 8;
Mengembalikan __ctrl;
}
private system.web.ui.control __buildControl__Control3 () {{)
System.web.ui.htmlControls.htmlbutton __ctrl;
__ctrl = System.web.Ui.htmlControls.htmlButton () baru ();
ini .__ kontrol3 = __ctrl;
System.web.ui.iparserAccessor __parser = (System.web.ui.iparserAccessor) (__ctrl));
__parser.addparsedSubObject (baru system.web.ui.literalControl (OK));
__Ctrl.serverClick += System.eventhandler baru (this.onnamesubmit);
Mengembalikan __ctrl;
}
Sistem Pribadi.web.ui.Control
System.web.ui.htmlControls.htmlform __ctrl;
__ctrl = sistem baru.web.ui.htmlControls.htmlform ();
ini .__ kontrol2 = __ctrl;
System.web.ui.iparserAccessor __parser = (System.web.ui.iparserAccessor) (__ctrl));
__Parser.addparsedSubObject (new System.web.ui.literalControl (/r/n <h1> dlltest -ex2 (Contoh 2) </h1>/r/n <hr>/r/n))))
ini .__ BuildControlnotelabel ();
__parser.addparsedSubbObject (this.notelabel);
__Parser.addparsedSubObject (baru system.web.ui.literalControl (/r/n));
ini .__ buildControlf_name ();
__parser.addparsedSubObject (this.f_name);
__Parser.addparsedSubObject (baru system.web.ui.literalControl (/r/n));
ini .__ BuildControl__Control3 ();
__Parser.addparsedSubboBject (ini .___ control3);
__Parser.addparsedSubObject (baru system.web.ui.literalControl (/r/n));
Mengembalikan __ctrl;
}
Private Void __BuildControltree (System.web.ui.Control __ctrl) {
System.web.ui.iparserAccessor __parser = (System.web.ui.iparserAccessor) (__ctrl));
__parser.addparsedSubObject (new System.web.ui.literalControl (/r/n/r/n <html>/r/n << body>/r/n));
ini .__ BuildControl__Control2 ();
__Parser.addparsedSubbObject (ini .___ control2);
__Parser.addparsedSubObject (baru System.web.ui.literalControl
}
Override void frameworkinitialize () {yang dilindungi () {
ini .__ buildControltree (ini);
this.fileDependencies = asp.ex2_aspx .__ FileDependencies;
this.enableViewStateMac = true;
}
Public override int getTypehashCode () {) {)
Return -11574299;
}
}
}
/* File sumber: ex2_aspx.cs end*/
Saya percaya bahwa setelah menganalisis file ini, Anda akan memiliki pemahaman lebih lanjut tentang prinsip operasi ASP.NET (tidak ada hubungannya dengan artikel ini, tidak masuk akal).
Dalam status baris perintah, Compile Command berikut Compile ex2_aspx.cs ke ex2.dll dan simpan di direktori bin.
Csc /t: library /oxin/ex2.dll ex2_aspx.cs
Tambahkan ASPX-> DLL Pemetaan ke file konfigurasi Web.config, yaitu, tambahkan baris berikut di httphandlers di bagian System.web:
<DERB =* path = dlltest2.aspx type = asp.ex2_aspx, ex2 />
Sekarang ketika browser mengunjungi http: //localhost/dlltest/dlltest2.aspx, itu seperti mengakses ex2.aspx. Tentu saja, bahkan jika Ex2.aspx tidak ada, atau telah diperbarui, itu tidak akan berdampak pada akses halaman, kecuali bin/ex2.dll dihasilkan kembali.
Keempat, kompilasi file aspx codebehind ke dalam DLL
Untuk mengkompilasi file ASPX CodeBehind ke DLL, prinsip mengubah file ASPX menjadi file sumber CS sama seperti di atas. sebagai file sumber CS. Perbedaannya adalah langkah -langkah ketika dikompilasi ke dalam DLL: (untuk kenyamanan naratif, dengan asumsi bahwa file antarmuka adalah ex3.aspx, file codebehind adalah ex3.aspx.cs, dan "sumber kompilasi lengkap" dari ex3.aspx disimpan sebagai ex3_aspx.cs))
Langkah 1: Pertama gunakan perintah berikut untuk mengkompilasi ex3.aspx.cs menjadi bin/ex3.aspx.cs.dll
CSC /T: library /oxin/ex3.aspx.cs.dll ex3.aspx.cs
Langkah 2: Gunakan perintah berikut untuk mengkompilasi ex3_aspx.cs menjadi bin/ex3.dll
Csc /t: library /r:bin/ex3.aspx.cs.dll /out:bin/ex3.dll ex3_aspx.cs
Kemudian tambahkan pemetaan ASPX-> DLL ke file konfigurasi Web.config, yaitu, tambahkan baris berikut di httphandlers di bagian System.web:
<tambahkan verb =* path = dlltest3.aspx type = asp.ex3_aspx, ex3 />
Sekarang buka browser dan kunjungi http: //localhost/dlltest/dlltest3.aspx.
Lima, sedikit trik
Saat mengatur "jebakan" untuk mengonversi file ASPX menjadi file sumber CS, umumnya menggunakan metode salinan dan paste untuk menyimpan "sumber kompilasi lengkap" di notepad atau vs.net atau lingkungan pengembangan ASP.NET lainnya, dan kemudian simpan itu setelah menyelesaikan pelestarian untuk file sumber CS.
Pengorganisasian adalah untuk menghapus informasi nomor garis dari pasta dan instruksi kompilasi "#line". Jika informasi ini dihapus secara manual, itu akan terlalu merepotkan.
Salah satu trik yang saya gunakan adalah: di notebook, gunakan metode penggantian untuk mengatur dengan cepat. Gunakan/* baris untuk mengganti semua baris, gunakan:*/Untuk mengganti semua:, gunakan // #line baris untuk mengganti semua #line, setelah penggantian selesai, anotasi "perangkap kode", atur pengaturan fungsi struktur kelas utama , Atur pengaturan fungsi konstruktor utama kalimat "file ketergantungan" dianotasi, jadi bahkan jika finishing selesai.