8.2 Pipa ASP.NET dan siklus hidup aplikasi
Bagian 8.1 memperkenalkan arsitektur sistem IIS dan keseluruhan proses pemrosesan permintaan HTTP. Dari situ, kita dapat mengetahui bahwa setiap situs web ASP.NET sesuai dengan aplikasi Web, yang dapat merespons permintaan HTTP dan memberikan informasi yang diperlukan kepada pengguna. Jadi, bagaimana sebenarnya aplikasi ASP.NET merespons permintaan HTTP? Prosedur pemrosesan spesifik apa yang disertakan? Ini melibatkan siklus hidup aplikasi ASP.NET.
8.2.1 Siklus hidup aplikasi ASP.NET*
Bagian ini mengambil IIS 6 sebagai contoh untuk memperkenalkan langkah demi langkah proses pemrosesan permintaan HTTP oleh aplikasi ASP.NET. Proses IIS 7 memiliki beberapa perubahan kecil dibandingkan dengan IIS 6, namun secara umum konsisten.
1 Browser mengeluarkan permintaan HTTP untuk mengakses halaman web ASP.NET.
Asumsikan bahwa permintaan ini adalah permintaan pertama ke aplikasi ASP.NET yang memiliki halaman web ini.
Ketika permintaan ini mencapai server Web, HTTP.SYS bertanggung jawab untuk menerimanya. Menurut URL permintaan ini, HTTP.SYS meneruskannya ke kumpulan aplikasi yang sesuai dengan aplikasi ASP.NET ini, dan kumpulan aplikasi yang berjalan di aplikasi ini. pool Proses pekerja bertanggung jawab untuk memproses permintaan [1].
Setelah proses pekerja menerima permintaan ini, ia memuat ekstensi ISAPI "aspnet_isapi.dll" yang didedikasikan untuk memproses halaman ASP.NET dan meneruskan permintaan HTTP ke sana.
Setelah proses pekerja memuat aspnet_isapi.dll, aspnet_isapi.dll bertanggung jawab untuk memuat lingkungan aplikasi ASP.NET yang sedang berjalan - CLR [2].
Proses pekerja bekerja di lingkungan yang tidak dikelola (merujuk pada sistem operasi Windows itu sendiri), sedangkan objek di .NET bekerja di lingkungan terkelola (merujuk pada CLR). aspnet_isapi.dll bertindak sebagai jembatan untuk berkomunikasi antara keduanya permintaan yang diterima (dari lingkungan yang tidak dikelola) diteruskan ke objek .NET yang sesuai (dalam lingkungan terkelola) untuk diproses.
2 Buat objek ApplicationManager dan domain aplikasi
Setelah CLR dimuat, kelas ApplicationManager bertanggung jawab untuk membuat domain aplikasi. Setiap aplikasi ASP.NET berjalan di domain aplikasinya sendiri dan diidentifikasi oleh pengidentifikasi aplikasi unik.
Setiap domain aplikasi sesuai dengan instance kelas ApplicationManager, yang bertanggung jawab untuk mengelola aplikasi ASP.NET yang berjalan di domain tersebut (seperti memulai dan menghentikan aplikasi ASP.NET, membuat objek di aplikasi ASP.NET tertentu, dll.) .
3 Buat objek HostingEnvironment
Saat membuat domain aplikasi untuk aplikasi ASP.NET, objek HostingEnvironment dibuat, yang menyediakan beberapa informasi manajemen untuk aplikasi ASP.NET (seperti identitas aplikasi ASP.NET, direktori virtual dan direktori fisik yang sesuai), dan menyediakan beberapa fungsi tambahan (seperti mendaftarkan objek di domain aplikasi, meniru identitas pengguna tertentu, dll.).
4 Buat objek ASP.NET Core untuk setiap permintaan
Ketika domain aplikasi dibuat, objek ISAPIRuntime dibuat dan metode ProcessRequest()-nya dipanggil secara otomatis. Dalam metode ini, objek ISAPIRuntime membuat objek HttpWorkerRequest berdasarkan permintaan HTTP yang masuk. Objek ini membungkus berbagai informasi permintaan HTTP dengan cara berorientasi objek (yaitu, informasi permintaan HTTP asli dienkapsulasi sebagai objek HttpWorkerRequest). Kemudian, panggil metode StartProcessing() dari objek ISAPIRuntime untuk memulai seluruh proses pemrosesan permintaan HTTP (ini adalah "Pipa HTTP: Pipa HTTP"). Pada awal proses pemrosesan ini, objek tipe HttpRuntime dibuat, dan Objek HttpWorkerRequest yang dibuat sebelumnya digunakan sebagai Parameter metode diteruskan ke metode ProcessRequest() objek HttpRuntime ini.
Beberapa pekerjaan yang sangat penting dilakukan dalam metode ProcessRequest() kelas HttpRuntime, di antaranya yang paling erat kaitannya dengan insinyur perangkat lunak Web adalah:
Metode ProcessRequest() kelas HttpRuntime membuat objek HttpContext berdasarkan informasi permintaan HTTP yang disediakan dalam objek HttpWorkerRequest.
Objek HttpContext penting karena objek ini berisi dua objek lain yang sangat umum dalam pemrograman ASP.NET: HttpResponse dan HttpRequest.
Informasi dalam objek HttpRequest berasal dari permintaan HTTP asli. Misalnya, atribut Url mewakili URL dalam informasi permintaan HTTP asli.
Objek HttpResponse memiliki beberapa properti dan metode untuk menghasilkan informasi untuk dikembalikan ke browser.
Kelas Halaman menyediakan properti yang sesuai untuk mereferensikan kedua objek ini, sehingga Anda bisa langsung menggunakan properti "Requset" dan "Respon" untuk mengakses kedua objek ini di halaman web ASP.NET. Misalnya:
kelas parsial publik _Default : System.Web.UI.Page
{
dilindungi kekosongan Page_Load (pengirim objek, EventArgs e)
{
Respon .Write(Permintaan .Url);
}
}
Properti Context dari kelas Page mengacu pada objek HttpContext, sehingga kode di atas juga dapat ditulis ulang dalam bentuk berikut:
kelas parsial publik _Default : System.Web.UI.Page
{
dilindungi kekosongan Page_Load (pengirim objek, EventArgs e)
{
this.Context.Response .Write(this.Context.Request .Url);
}
}
Mengenai ketiga objek HttpContext, HttpResponse dan HttpRequest, Anda harus menguasai poin-poin berikut:
l Objek HttpContext berisi dua objek, HttpResponse dan HttpRequest. Anda dapat memperoleh informasi terkait permintaan HTTP dari objek HttpRequest, dan konten yang akan dikeluarkan ke browser dapat diperoleh dengan memanggil metode HttpResponse.
l Untuk setiap permintaan HTTP, ASP.NET membuat objek HttpContext, yang dapat diakses selama seluruh pemrosesan HTTP.
5 Alokasikan objek HttpApplication untuk menangani permintaan
Selain membuat objek HttpContext, metode ProcessRequest() dari kelas HttpRuntime juga menyelesaikan pekerjaan lain yang sangat penting - menerapkan pengalokasian objek HttpApplication ke instance kelas HttpApplicationFactory [3] untuk mengelola setiap langkah dalam keseluruhan pemrosesan permintaan HTTP pipa. semacam acara.
Objek HttpApplicationFactory bertanggung jawab untuk mengelola kumpulan objek HttpApplication [4]. Ketika permintaan HTTP datang, jika ada objek HttpApplication yang tersedia di kumpulan, objek ini langsung dialokasikan untuk memproses permintaan HTTP dibuat.
6 Objek HttpApplication memulai pipa HTTP
Objek HttpApplication bertanggung jawab untuk merakit seluruh "pipa pemrosesan permintaan HTTP (Pipa HTTP)". "Pipa pemrosesan permintaan HTTP" dapat dibandingkan dengan "pipa produksi" di pabrik modern. Objek HttpContext yang dibuat pada langkah sebelumnya adalah "produk" yang akan diproses oleh pipa produksi ini. Ketika mengalir melalui bagian berbeda dari "pipa produksi", maka akan diproses dan diproses secara khusus.
Bagaimana “proses dan perlakuan” spesifik ini terjadi?
Sederhananya, ketika objek HttpContext melewati bagian berbeda dari "pipa produksi", objek HttpApplication akan memicu serangkaian peristiwa [5]. Komponen tertentu - modul HTTP (Modul HTTP) dapat merespons peristiwa ini. Dalam kode respons peristiwa ini, objek HttpContext dapat "diproses dan diproses". Dalam hal ini, modul HTTP dapat dianggap sebagai "jalur produksi" ”pekerja di. Modul HTTP sebenarnya adalah "filter ISAPI" yang diperkenalkan sebelumnya.
Objek modul HTTP dibuat dalam metode InitModules() [6] dari objek HttpApplication. Kami biasanya menulis kode dalam metode Init() [7] dari objek modul HTTP sehingga dapat merespons peristiwa tertentu yang dipicu oleh HttpApplication obyek.
ASP.NET menyediakan beberapa modul HTTP yang telah ditentukan sebelumnya untuk merespons peristiwa tertentu, dan insinyur perangkat lunak Web juga dapat menulis modul HTTP mereka sendiri dan memasukkannya ke dalam "pipa pemrosesan permintaan HTTP" [8].
Di tengah-tengah pipa (setelah memproses peristiwa terkait), objek HttpContext diterima oleh objek Halaman akhir (inilah sebabnya objek HttpContext dapat diakses di halaman ASP.NET melalui properti Konteks yang ditentukan oleh kelas Halaman).
Setiap halaman ASP.NET yang diakses akan diubah menjadi "kelas halaman yang berasal dari kelas Halaman".
Catatan: Kelas Page mengimplementasikan antarmuka IHttpHandler, yang mendefinisikan metode ProcessRequest().
Setelah kelas halaman ASP.NET dibuat, secara otomatis dikompilasi ke dalam perakitan, dan kemudian metode ProcessRequest() secara otomatis dipanggil (karena kelas Halaman mengimplementasikan antarmuka IHttpHandler, maka harus memiliki metode ini). Dalam metode ini, kode yang ditulis oleh insinyur perangkat lunak web dieksekusi (jika ada). Hasil eksekusi metode ProcessRequest() sekali lagi dibawa oleh objek HttpContext, kontrol ditransfer kembali ke "pipa pemrosesan permintaan HTTP", dan objek HttpApplication terus mengaktifkan kejadian berikutnya. Saat ini, jika ada modul HTTP tertentu yang merespons kejadian ini, modul tersebut akan dipanggil secara otomatis.
Objek HttpContext membawa hasil pemrosesan akhir ke akhir "pipa pemrosesan permintaan HTTP", dan informasinya diambil dan dikirim kembali ke proses pekerja menggunakan aspnet_isapi.dll sebagai jembatan. Proses pekerja kemudian mentransfer hasil pemrosesan permintaan HTTP ke HTTP.SYS, yang bertanggung jawab untuk mengembalikan hasilnya ke browser.
Menurut pendahuluan sebelumnya, keseluruhan pipa HTTP dapat dibagi menjadi tiga bagian: tahap pra-pemrosesan à tahap pemrosesan à tahap pasca-pemrosesan (Gambar 8 ‑14).
Gambar 8 & #8209; 14 Tiga tahap pipa HTTP
Seperti yang ditunjukkan pada Gambar 8 ‑14, tahap pra-pemrosesan dan pasca-pemrosesan dari pipa HTTP terutama diikuti oleh beberapa modul HTTP dan didorong oleh peristiwa. Pekerjaan yang diselesaikan dalam dua tahap ini terutama untuk melakukan berbagai atribut dari objek HttpContext.
Pemrosesan permintaan HTTP pada akhirnya diselesaikan dalam "fase pemrosesan" oleh objek yang mengimplementasikan antarmuka IHttpHandler. Setiap kelas halaman yang dihasilkan oleh halaman web ASP.NET mengimplementasikan antarmuka ini. Objek PageHandlerFactory [9] bertanggung jawab untuk membuat objek pemrosesan permintaan HTTP yang sesuai.
Dapat dilihat bahwa objek yang mengimplementasikan antarmuka IHttpHandler bertanggung jawab untuk memproses permintaan HTTP, oleh karena itu disebut "Handler (handler)".
Selain halaman web ASP.NET yang paling umum, insinyur perangkat lunak Web juga dapat membuat objek mereka sendiri yang mengimplementasikan antarmuka IHttpHandler dan memasukkannya ke dalam pipa HTTP untuk menangani permintaan HTTP.
Ketika permintaan HTTP diproses, objek terkait dilepaskan, namun domain aplikasi yang dibuat, HttpApplication, dan objek lainnya masih bertahan untuk merespons permintaan HTTP berikutnya.
7 Ringkasan siklus hidup aplikasi ASP.NET
Bagian ini memperkenalkan siklus hidup aplikasi ASP.NET Ini adalah proses yang cukup kompleks. Mungkin lebih mudah untuk dipahami dengan analogi populer berikut:
l "Pipa pemrosesan permintaan HTTP" adalah "jalur perakitan produksi" di pabrik modern, dan objek HttpContext adalah produk yang akan diproses di jalur perakitan ini.
l Objek HttpHandler (HTTP handler) adalah inti dari keseluruhan "lini produksi produk", yang bertanggung jawab untuk merakit produk menjadi bentuk.
l HttpModule (modul HTTP) setara dengan pekerja tambahan di "lini produksi". Mereka melakukan "pra-pemrosesan" (persiapan perakitan produk) dan "pasca-pemrosesan" (persiapan pengiriman produk, seperti pelabelan) pada produk (objek HttpContext) ).
l Objek HttpApplication adalah "pemimpin" dari seluruh "lini produksi". Dia bertanggung jawab untuk mengalokasikan pekerja ke "lini produksi" (menginisialisasi dan memuat semua HttpModules yang terdaftar), dan kemudian memicu serangkaian peristiwa (disebut "ASP. peristiwa aplikasi .NET" "), HttpModule tertentu bertanggung jawab untuk merespons peristiwa tertentu.
--------------------------------------------------- -----------------------------------
[1] Jika proses pekerja tidak ada, program pemantauan IIS WS akan membuatnya, jika tidak, proses pekerja yang ada akan digunakan kembali.
[2] Dalam mode terintegrasi IIS 7, karena CLR sudah dimuat sebelumnya, langkah ini tidak diperlukan.
[3] "Instance of class" dan "object of class" memiliki arti yang sama, dan keduanya mengacu pada objek yang dibuat menggunakan kelas sebagai templat.
[4] Kumpulan objek (kumpulan objek) adalah metode organisasi objek umum dalam sistem perangkat lunak berorientasi objek. Ini dapat dianggap sebagai wadah objek. Kumpulan objek berisi beberapa objek yang dibuat sebelumnya. Ketika dunia luar membutuhkan suatu objek, dunia luar dapat langsung mengeluarkan objek yang sudah jadi dari kumpulan dan menggunakannya, sehingga menghindari hilangnya kinerja yang disebabkan oleh seringnya pembuatan objek.
[5] HttpApplication mendefinisikan beberapa acara. Untuk daftar lengkap acara, silakan lihat MSDN.
[6] Metode ini akan dipanggil secara otomatis ketika mendapatkan objek HttpApplication.
[7] Semua modul HTTP harus mengimplementasikan antarmuka IHttpModule, dan metode Init() ditentukan oleh antarmuka ini.
[8] Modul HTTP yang disesuaikan dapat ditambahkan ke aliran pemrosesan permintaan HTTP dengan memasukkan konten tertentu di Web.Config.
[9] Ini adalah inti lain dalam kerangka teknologi ASP.NET