Ringkasan:
Artikel ini didasarkan pada kode sumber ASP.NET 2.0 dan melakukan analisis singkat tentang runtime ASP.NET 2.0. Saya harap dapat membantu Anda memahami proses pemrosesan permintaan dan model kompilasi halaman di ASP.NET 2.0.
Kata kunci:
Runtime ASP.NET 2.0, prinsip, pemrosesan permintaan, kompilasi halaman,
kelas utama ASP.NET 2.0 HTTP Runtime:
Sistem.Web.HttpRuntime
Sistem.Web.HttpApplicationFactory
Sistem.Web.HttpApplication
Sistem.Web.Kompilasi.BuildManager
Sistem.Web.Kompilasi.ApplicationBuildProvider
Sistem.Web.Kompilasi.BuildProvidersCompiler
Sistem.Web.UI.PageHandlerFactory
Diagram alir singkat pemrosesan permintaan:
Saran membaca:
Gunakan alat Reflektor untuk melihat kode sumber ASP.NET 2.0 saat membaca.
menganalisa:
Ketika kami memulai permintaan ke halaman asp.net di situs web ASP.NET 2.0 melalui browser, IIS pertama kali menerima permintaan di sisi server. Ketika IIS melihat bahwa itu adalah halaman asp.net, saya merasa sangat senang karena ini permintaan tidak perlu diproses, serahkan saja pada ASP.NET ISAPI. Pekerjaan ASP.NET ISAPI juga relatif mudah. Tugas utamanya adalah mengatur aspnet_wp.exe untuk memproses permintaan dan memantau pelaksanaan proses aspnet_wp.exe. Jika proses aspnet_wp.exe terlalu lelah dan tidak dapat menyelesaikan tugas nah, ASP.NET ISAPI akan memberhentikannya dan menggantinya dengan aspnet_wp.exe baru untuk menangani pekerjaan itu.
Tugas utama aspnet_wp.exe adalah menyerahkan permintaan ke serangkaian objek terkelola yang disebut saluran pipa HTTP. Jika ASP.NET ISAPI dibandingkan dengan manajer penjualan, maka aspnet_wp.exe adalah manajer produksi, dan saluran HTTP adalah saluran produksi. Tim yang bertanggung jawab atas jalur perakitan adalah HttpRuntime. Manajer produksi aspnet_wp.exe akan menyerahkan pesanan (permintaan HTTP) kepada anggota tim HttpRuntime ProcessRequest (HttpWorkerRequest wr). ) menurut pembagian kerja internal, jadi ProcessRequestInternal(HttpWorkerRequest wr) adalah fokus analisis kami.
Pekerjaan utama ProcessRequestInternal adalah:
1. Buat instance HttpContext.
2. Inisialisasi permintaan pertama (EnsureFirstRequestInit).
a) Lakukan beberapa pekerjaan inisialisasi di PastikanFirstRequestInit dengan memanggil System.Web.HttpRuntime.FirstRequestInit, seperti membaca konfigurasi Web.Config ke RuntimeConfig dan memuat semua file dll dari direktori bin.
3. Buat instance HttpWriter.
4. Buat instans HttpApplication dengan memanggil HttpApplicationFactory.GetApplicationInstance.
Ada tiga metode utama di HttpApplicationFactory.GetApplicationInstance:
HttpApplicationFactory._theApplicationFactory.EnsureInited();
HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(konteks);
context
);
1) HttpApplicationFactory._theApplicationFactory.EnsureInited();
Metode ini memeriksa apakah HttpApplicationFactory telah diinisialisasi. Jika belum, maka diinisialisasi melalui HttpApplicationFactory.Init().
Di Init(), pertama-tama dapatkan path lengkap file global.asax, lalu panggil CompileApplication() untuk mengkompilasi global.asax.
Bagaimana kompilasi dilakukan?
Pekerjaan kompilasi diselesaikan oleh BuildManager. BuildManager pertama-tama mendapatkan GlobalAsaxType (yaitu, HttpApplication), lalu memanggil BuildManager.GetGlobalAsaxBuildResult() =》GetGlobalAsaxBuildResultInternal() =》EnsureTopLevelFilesCompiled() untuk kompilasi.
Di PastikanTopLevelFilesCompiled, CompilationStage.TopLevelFiles dikompilasi terlebih dahulu, dan file di tiga direktori berikut dikompilasi:
a.KompilasiResourcesDirectory();
Kompilasi direktori App_GlobalResources.
b.KompilasiWebRefDirectory();
Kompilasi direktori App_WebReferences.
c.Kompilasi KodeDirektori();
Kompilasi direktori App_Code.
Kemudian kompilasi CompilationStage.GlobalAsax, kompilasi global.asax, dan pemanggilan metode: CompileGlobalAsax()=》ApplicationBuildProvider.GetGlobalAsaxBuildResult(BuildManager.IsPrecompiledApp).
Kompilasi spesifik di GetGlobalAsaxBuildResult diselesaikan oleh ApplicationBuildProvider dan BuildProvidersCompiler.
BuildProvidersCompiler.PerformBuild(); melakukan pekerjaan kompilasi.
ApplicationBuildProvider.GetBuildResult mendapatkan hasil kompilasi.
Setelah kompilasi berhasil, file dll yang mirip dengan App_global.asax.mlgx7n2v.dll akan dibuat di direktori yang sesuai di C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files.
Kelas yang dikompilasi diberi nama ASP.global_asax dan mewarisi dari HttpApplication.
Catatan: Jika tidak ada file Global.asax di direktori Web, file seperti App_global.asax.mlgx7n2v.dll tidak akan dikompilasi dan dibuat.
2) HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(konteks);
Buat instans HttpApplication tertentu, picu peristiwa ApplicationOnStart, dan jalankan metode Application_Start(pengirim objek, EventArgs e) di ASP.global_asax. Contoh HttpApplication yang dibuat di sini didaur ulang setelah memproses peristiwa tersebut.
3) HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(konteks);
Metode ini membuat instance HttpApplication dan menginisialisasinya (memanggil metode System.Web.HttpApplication.InitInternal()).
Membuat instance HttpApplication didasarkan pada _theApplicationType yang sebenarnya. Jika tidak ada file global.asa di direktori Web, artinya, tidak ada kompilasi dinamis untuk menghasilkan tipe ASP.global_asax, lalu buat instance HttpApplication secara langsung. Jika tipe ASP.global_asax dibuat, buat instance ASP.global_asa.
Setelah membuat instance HttpApplication, panggil metode InitInternal dari instance tersebut.
Metode InitInternal juga merupakan metode yang kami fokuskan. Fungsi utama dari metode ini adalah sebagai berikut:
1. InitModules(): Buat HttpModules yang sesuai sesuai dengan pengaturan Web.Config.
2. HookupEventHandlersForAppplicationAndModules: Berdasarkan peristiwa yang terjadi, panggil fungsi pemrosesan peristiwa terkait dalam contoh HttpApplication.
3. Buat banyak instance kelas yang mengimplementasikan antarmuka IExecutionStep dan tambahkan ke _execSteps instance HttpApplication saat ini, dan tunggu eksekusi panggilan balik. Dari sini kita dapat melihat bahwa HttpApplication memproses permintaan secara asinkron, dan banyak tugas pemrosesan permintaan dimasukkan ke _execStep untuk menunggu panggilan balik dieksekusi.
Pekerjaan pemrosesan utama di _execStep adalah sebagai berikut:
1) Lakukan pemeriksaan keamanan pada jalur yang diminta dan larang akses jalur ilegal (ValidatePathExecutionStep).
2) Jika UrlMappings disetel, lakukan RewritePath(UrlMappingsExecutionStep).
3) Jalankan fungsi pemrosesan acara, seperti: BeginRequest, AuthenticateRequest, dll.
4) Dapatkan HttpHandler yang menangani permintaan saat ini. Kompilasi runtime halaman ASP.NET juga dilakukan di sini. (Langkah Eksekusi MapHandler)
Pemrosesan ini dilakukan dengan memanggil metode System.Web.HttpApplication.MapHttpHandler.
Di MapHttpHandler, pertama-tama dapatkan tipe terkait yang mengimplementasikan IHttpHandlerFactory dari web.config sesuai dengan alamat yang diakses. Untuk halaman asp.net, defaultnya adalah PageHanlderFactory. Kemudian buat instance PageHanlderFactory, panggil GetHandlerHelper, panggil BuildManager.CreateInstanceFromVirtualPath di GetHandlerHelper untuk mengkompilasi dan membuat instance halaman ASP.NET yang saat ini diminta (jika sudah dikompilasi, muat langsung dari cache).
CreateInstanceFromVirtualPath meneruskan tugas kompilasi ke BuildManager (CompileWebFile() setelah beberapa pemanggilan metode). CompileWebFile mendapatkan BuildProvider yang sesuai dari web.config. Untuk file .aspx, BuildProvider yang sesuai adalah PageBuildProvider. Cara PageBuildProvider mengkompilasi halaman tidak akan dianalisis lebih lanjut di sini. Jika tertarik, Anda dapat mempelajari lebih lanjut kode sumber ASP.NET 2.0.
5) Panggil metode .ProcessRequest dari HttpHandler yang sesuai untuk memproses permintaan (jika asinkron, panggil BeginProcessReques). (Langkah Eksekusi CallHandler)
6) Tulis konten tanggapan ke dalam Filter. (CallFilterExecutionStep)
5. Panggil BeginProcessRequest dari instance HttpApplication untuk memproses permintaan secara asinkron.
Banyak hal yang terjadi di _execSteps yang disebutkan di atas dijalankan setelah HttpRuntime memanggil HttpApplication BeginProcessRequest dan kemudian memanggil ResumeSteps di BeginProcessRequest.
Runtime ASP.NET 2.0 adalah bagian yang sangat kompleks, sulit dipahami dan penting dari ASP.NET 2.0. Mempelajari kode sumber runtime ASP.NET 2.0 akan membantu kita memperdalam pemahaman kita tentang prinsip-prinsip ASP.NET 2.0 dan akan beri kami Mengembangkan aplikasi ASP.NET 2.0 membawa banyak bantuan. Artikel ini adalah pertama kalinya saya mempelajari runtime ASP.NET 2.0. Artikel ini ditulis untuk membantu saya lebih memahami runtime ASP.NET 2.0. Anda dipersilakan untuk mengkritik dan memberikan saran terhadap isi artikel.
Saya merasa bahwa menulis artikel tidak hanya dapat meningkatkan keterampilan menulis dan memfasilitasi komunikasi, tetapi juga melalui menulis artikel, seseorang dapat memperjelas idenya sendiri, mendorong pemikiran yang mendalam, dan memperdalam pemahamannya tentang teknologi Menulis beberapa artikel teknis masih sangat membantu untuk meningkatkan diri.