8.2 ไปป์ไลน์ ASP.NET และวงจรชีวิตของแอปพลิเคชัน
ส่วนที่ 8.1 แนะนำสถาปัตยกรรมระบบของ IIS และกระบวนการโดยรวมของการประมวลผลคำขอ HTTP จากนั้นเราจะทราบได้ว่าเว็บไซต์ ASP.NET แต่ละแห่งสอดคล้องกับแอปพลิเคชันเว็บ ซึ่งสามารถตอบสนองต่อคำขอ HTTP และให้ข้อมูลที่จำเป็นแก่ผู้ใช้ ดังนั้นแอปพลิเคชัน ASP.NET ตอบสนองต่อคำขอ HTTP อย่างไร มีขั้นตอนการประมวลผลเฉพาะอะไรบ้าง? สิ่งนี้เกี่ยวข้องกับวงจรชีวิตของแอปพลิเคชัน ASP.NET
8.2.1 วงจรชีวิตของแอปพลิเคชัน ASP.NET*
ส่วนนี้ใช้ IIS 6 เป็นตัวอย่างเพื่อแนะนำกระบวนการประมวลผลคำขอ HTTP โดยแอปพลิเคชัน ASP.NET ทีละขั้นตอน กระบวนการของ IIS 7 มีการเปลี่ยนแปลงเล็กน้อยเมื่อเทียบกับ IIS 6 แต่โดยทั่วไปมีความสอดคล้องกัน
1 เบราว์เซอร์ออกคำขอ HTTP เพื่อเข้าถึงเว็บเพจ ASP.NET
สมมติว่าคำขอนี้เป็นคำขอแรกไปยังแอปพลิเคชัน ASP.NET ซึ่งมีเว็บเพจนี้อยู่
เมื่อคำขอนี้ไปถึงเว็บเซิร์ฟเวอร์ HTTP.SYS จะรับผิดชอบในการรับคำขอดังกล่าว ตาม URL ของคำขอนี้ HTTP.SYS จะส่งผ่านไปยังกลุ่มแอปพลิเคชันที่สอดคล้องกับแอปพลิเคชัน ASP.NET นี้ และกลุ่มแอปพลิเคชันที่ทำงานในแอปพลิเคชันนี้ กระบวนการของผู้ปฏิบัติงานพูลมีหน้าที่รับผิดชอบในการประมวลผลคำขอ[1]
หลังจากที่กระบวนการของผู้ปฏิบัติงานได้รับการร้องขอนี้ จะโหลดส่วนขยาย ISAPI "aspnet_isapi.dll" สำหรับการประมวลผลเพจ ASP.NET และส่งคำขอ HTTP ไปยังกระบวนการดังกล่าว
หลังจากที่กระบวนการของผู้ปฏิบัติงานโหลด aspnet_isapi.dll แล้ว aspnet_isapi.dll จะรับผิดชอบในการโหลดสภาพแวดล้อมการทำงานของแอปพลิเคชัน ASP.NET - CLR [2]
กระบวนการของผู้ปฏิบัติงานทำงานในสภาพแวดล้อมที่ไม่มีการจัดการ (อ้างอิงถึงระบบปฏิบัติการ Windows เอง) ในขณะที่วัตถุใน .NET ทำงานในสภาพแวดล้อมที่มีการจัดการ (อ้างอิงถึง CLR) aspnet_isapi.dll ทำหน้าที่เป็นสะพานเชื่อมในการสื่อสารระหว่างทั้งสอง คำขอที่ได้รับ (จากสภาพแวดล้อมที่ไม่มีการจัดการ) จะถูกส่งต่อไปยังวัตถุ .NET ที่เกี่ยวข้อง (ในสภาพแวดล้อมที่มีการจัดการ) เพื่อการประมวลผล
2 สร้างวัตถุ ApplicationManager และโดเมนแอปพลิเคชัน
หลังจากโหลด CLR แล้ว คลาส ApplicationManager จะรับผิดชอบในการสร้างโดเมนแอปพลิเคชัน แอปพลิเคชัน ASP.NET แต่ละตัวทำงานในโดเมนแอปพลิเคชันของตัวเอง และระบุโดยตัวระบุแอปพลิเคชันเฉพาะ
แต่ละโดเมนแอปพลิเคชันสอดคล้องกับอินสแตนซ์ของคลาส ApplicationManager ซึ่งรับผิดชอบในการจัดการแอปพลิเคชัน ASP.NET ที่ทำงานอยู่ในโดเมน (เช่นการเริ่มต้นและการหยุดแอปพลิเคชัน ASP.NET ในแอปพลิเคชัน ASP.NET ที่ระบุสร้างวัตถุ ฯลฯ ) .
3 สร้างวัตถุ HostingEnvironment
เมื่อสร้างโดเมนแอปพลิเคชันสำหรับแอปพลิเคชัน ASP.NET จะมีการสร้างออบเจ็กต์ HostingEnvironment ซึ่งให้ข้อมูลการจัดการบางอย่างสำหรับแอปพลิเคชัน ASP.NET (เช่น ข้อมูลประจำตัวของแอปพลิเคชัน ASP.NET ไดเรกทอรีเสมือนที่เกี่ยวข้อง และไดเรกทอรีทางกายภาพ ) และจัดให้มีฟังก์ชันการทำงานเพิ่มเติมบางอย่าง (เช่น การลงทะเบียนออบเจ็กต์ในโดเมนแอปพลิเคชัน การแอบอ้างเป็นผู้ใช้เฉพาะ เป็นต้น)
4 สร้างวัตถุ ASP.NET Core สำหรับแต่ละคำขอ
เมื่อโดเมนแอปพลิเคชันถูกสร้างขึ้น วัตถุ ISAPIRuntime จะถูกสร้างขึ้น และเมธอด ProcessRequest() จะถูกเรียกโดยอัตโนมัติ ในวิธีนี้ วัตถุ ISAPIRuntime สร้างวัตถุ HttpWorkerRequest โดยยึดตามการร้องขอ HTTP ขาเข้า วัตถุนี้ตัดข้อมูลต่าง ๆ ของการร้องขอ HTTP ในลักษณะเชิงวัตถุ (นั่นคือ ข้อมูลการร้องขอ HTTP ดั้งเดิมถูกห่อหุ้มเป็นวัตถุ HttpWorkerRequest) จากนั้น เรียกเมธอด StartProcessing() ของวัตถุ ISAPIRuntime เพื่อเริ่มกระบวนการประมวลผลคำขอ HTTP ทั้งหมด (นี่คือ "ไปป์ไลน์ HTTP: ไปป์ไลน์ HTTP") ที่จุดเริ่มต้นของกระบวนการประมวลผลนี้ วัตถุชนิด HttpRuntime จะถูกสร้างขึ้น และ วัตถุ HttpWorkerRequest ที่สร้างไว้ก่อนหน้านี้ถูกใช้เป็นพารามิเตอร์ของวิธีการถูกส่งไปยังเมธอด ProcessRequest() ของวัตถุ HttpRuntime นี้
งานที่สำคัญมากบางอย่างเสร็จสิ้นในเมธอด ProcessRequest() ของคลาส HttpRuntime ซึ่งงานที่เกี่ยวข้องกับวิศวกรซอฟต์แวร์เว็บมากที่สุด ได้แก่:
เมธอด ProcessRequest() ของคลาส HttpRuntime สร้างวัตถุ HttpContext ตามข้อมูลคำขอ HTTP ที่ให้ไว้ในวัตถุ HttpWorkerRequest
วัตถุ HttpContext มีความสำคัญเนื่องจากวัตถุนี้ประกอบด้วยวัตถุอื่น ๆ สองวัตถุที่พบบ่อยมากในการเขียนโปรแกรม ASP.NET: HttpResponse และ HttpRequest
ข้อมูลในวัตถุ HttpRequest มาจากคำขอ HTTP ดั้งเดิม ตัวอย่างเช่น แอตทริบิวต์ Url แสดงถึง URL ในข้อมูลคำขอ HTTP ดั้งเดิม
วัตถุ HttpResponse มีคุณสมบัติและวิธีการบางอย่างในการสร้างข้อมูลที่จะส่งกลับไปยังเบราว์เซอร์
คลาส Page มีคุณสมบัติที่สอดคล้องกันในการอ้างอิงวัตถุทั้งสองนี้ ดังนั้นคุณสามารถใช้คุณสมบัติ "Requset" และ "Response" เพื่อเข้าถึงวัตถุทั้งสองนี้ในเว็บเพจ ASP.NET ได้โดยตรง ตัวอย่างเช่น:
คลาสสาธารณะบางส่วน _Default: System.Web.UI.Page
-
โมฆะที่ได้รับการป้องกัน Page_Load (ผู้ส่งวัตถุ EventArgs e)
-
การตอบสนอง .Write (คำขอ .Url);
-
-
คุณสมบัติบริบทของคลาส Page อ้างอิงถึงวัตถุ HttpContext ดังนั้นโค้ดข้างต้นจึงสามารถเขียนใหม่ในรูปแบบต่อไปนี้:
คลาสสาธารณะบางส่วน _Default: System.Web.UI.Page
-
โมฆะที่ได้รับการป้องกัน Page_Load (ผู้ส่งวัตถุ EventArgs e)
-
this.Context.Response .Write (this.Context.Request .Url);
-
-
เกี่ยวกับวัตถุทั้งสาม HttpContext, HttpResponse และ HttpRequest คุณต้องเชี่ยวชาญประเด็นต่อไปนี้:
ออบเจ็กต์ HttpContext ประกอบด้วยออบเจ็กต์สองตัว HttpResponse และ HttpRequest คุณสามารถรับข้อมูลที่เกี่ยวข้องกับคำขอ HTTP ได้จากออบเจ็กต์ HttpRequest และเนื้อหาที่จะส่งออกไปยังเบราว์เซอร์สามารถทำได้โดยการเรียกเมธอด HttpResponse
สำหรับการร้องขอ HTTP แต่ละรายการ ASP.NET จะสร้างวัตถุ HttpContext ซึ่งสามารถเข้าถึงได้ในระหว่างการประมวลผล HTTP ทั้งหมด
5 จัดสรรวัตถุ HttpApplication เพื่อจัดการคำขอ
นอกเหนือจากการสร้างวัตถุ HttpContext แล้ว เมธอด ProcessRequest() ของคลาส HttpRuntime ยังทำงานที่สำคัญมากอีกงานหนึ่งอีกด้วย โดยนำไปใช้เพื่อจัดสรรวัตถุ HttpApplication ให้กับอินสแตนซ์ของคลาส HttpApplicationFactory [3] เพื่อจัดการแต่ละขั้นตอนในการประมวลผลคำขอ HTTP ทั้งหมด ไปป์ไลน์
วัตถุ HttpApplicationFactory มีหน้าที่จัดการพูลวัตถุ HttpApplication [4] เมื่อมีการร้องขอ HTTP ถ้ามีวัตถุ HttpApplication อยู่ในพูล วัตถุนี้จะถูกจัดสรรโดยตรงเพื่อประมวลผลคำขอ HTTP สร้าง.
6 วัตถุ HttpApplication เริ่มต้นไปป์ไลน์ HTTP
วัตถุ HttpApplication มีหน้าที่ในการรวบรวม "ไปป์ไลน์การประมวลผลคำขอ HTTP (HTTP Pipeline)" ทั้งหมด "ไปป์ไลน์การประมวลผลคำขอ HTTP" สามารถเปรียบเทียบได้กับ "ไปป์ไลน์การผลิต" ในโรงงานสมัยใหม่ ออบเจ็กต์ HttpContext ที่สร้างขึ้นในขั้นตอนก่อนหน้าคือ "ผลิตภัณฑ์" ที่จะประมวลผลโดยไปป์ไลน์การผลิตนี้ เมื่อไหลผ่านส่วนต่างๆ ของ "ไปป์ไลน์การผลิต" ก็จะถูกประมวลผลและประมวลผลโดยเฉพาะ
“กระบวนการและการรักษา” เฉพาะเหล่านี้เกิดขึ้นได้อย่างไร?
พูดง่ายๆ ก็คือ เมื่อวัตถุ HttpContext ผ่านส่วนต่างๆ ของ "ไปป์ไลน์การผลิต" ออบเจ็กต์ HttpApplication จะทริกเกอร์ชุดของเหตุการณ์ [5] ส่วนประกอบเฉพาะ - โมดูล HTTP (โมดูล HTTP) สามารถตอบสนองต่อเหตุการณ์เหล่านี้ได้ ในโค้ดตอบกลับเหตุการณ์นี้ ออบเจ็กต์ HttpContext สามารถ "ประมวลผลและประมวลผล" ได้ ในแง่นี้ โมดูล HTTP ถือได้ว่าเป็น "ไปป์ไลน์การผลิต" ” คนงานใน โมดูล HTTP จริงๆ แล้วคือ "ตัวกรอง ISAPI" ที่นำมาใช้ก่อนหน้านี้
วัตถุโมดูล HTTP ถูกสร้างขึ้นในวิธี InitModules() [6] ของวัตถุ HttpApplication โดยทั่วไปเราจะเขียนโค้ดในวิธี Init() [7] ของวัตถุโมดูล HTTP เพื่อให้สามารถตอบสนองต่อเหตุการณ์เฉพาะที่ถูกกระตุ้นโดย HttpApplication วัตถุ.
ASP.NET จัดให้มีโมดูล HTTP ที่กำหนดไว้ล่วงหน้าบางส่วนเพื่อตอบสนองต่อเหตุการณ์เฉพาะ และวิศวกรซอฟต์แวร์เว็บยังสามารถเขียนโมดูล HTTP ของตนเองและแทรกลงใน "ไปป์ไลน์การประมวลผลคำขอ HTTP" [8]
ในช่วงกลางของไปป์ไลน์ (หลังจากประมวลผลเหตุการณ์ที่เกี่ยวข้อง) วัตถุ HttpContext จะได้รับจากวัตถุหน้าสุดท้าย (นี่คือสาเหตุที่สามารถเข้าถึงวัตถุ HttpContext ในหน้า ASP.NET ผ่านคุณสมบัติบริบทที่กำหนดโดยคลาสหน้า)
แต่ละเพจ ASP.NET ที่เข้าถึงจะถูกแปลงเป็น "คลาสเพจที่ได้มาจากคลาสเพจ"
หมายเหตุ: คลาส Page ใช้อินเทอร์เฟซ IHttpHandler ซึ่งกำหนดเมธอด ProcessRequest()
หลังจากที่คลาสเพจ ASP.NET ถูกสร้างขึ้น มันจะถูกคอมไพล์โดยอัตโนมัติในแอสเซมบลี และจากนั้น ProcessRequest() วิธีการของมันจะถูกเรียกโดยอัตโนมัติ (เนื่องจากคลาสเพจใช้อินเทอร์เฟซ IHttpHandler จึงต้องมีวิธีนี้) ในวิธีนี้ โค้ดที่เขียนโดยวิศวกรซอฟต์แวร์เว็บจะถูกดำเนินการ (ถ้ามี) ผลลัพธ์การดำเนินการของเมธอด ProcessRequest() จะดำเนินการอีกครั้งโดยออบเจ็กต์ HttpContext การควบคุมจะถูกถ่ายโอนกลับไปยัง "ไปป์ไลน์การประมวลผลคำขอ HTTP" และออบเจ็กต์ HttpApplication ยังคงส่งสัญญาณเหตุการณ์ที่ตามมา ในขณะนี้ หากมีโมดูล HTTP เฉพาะที่ตอบสนองต่อเหตุการณ์เหล่านี้ พวกเขาจะถูกเรียกโดยอัตโนมัติ
ออบเจ็กต์ HttpContext นำผลการประมวลผลขั้นสุดท้ายมาที่จุดสิ้นสุดของ "ไปป์ไลน์การประมวลผลคำขอ HTTP" และข้อมูลจะถูกนำออกและส่งไปยังกระบวนการของผู้ปฏิบัติงานอีกครั้งโดยใช้ aspnet_isapi.dll เป็นบริดจ์ กระบวนการของผู้ปฏิบัติงานจะโอนผลการประมวลผลของคำขอ HTTP ไปยัง HTTP.SYS ซึ่งมีหน้าที่ในการส่งคืนผลลัพธ์ไปยังเบราว์เซอร์
ตามการแนะนำก่อนหน้านี้ ไปป์ไลน์ HTTP ทั้งหมดสามารถแบ่งออกเป็นสามส่วน: ขั้นตอนการเตรียมการประมวลผล ขั้นตอนการประมวลผล และขั้นตอนหลังการประมวลผล (รูปที่ 8 ‑14)
รูปที่ 8 ‑ 14 ไปป์ไลน์ HTTP สามขั้นตอน
ดังที่แสดงในรูปที่ 8 & # 8209; 14 ขั้นตอนก่อนการประมวลผลและหลังการประมวลผลของไปป์ไลน์ HTTP ส่วนใหญ่มีส่วนร่วมโดยโมดูล HTTP หลายตัวและขับเคลื่อนโดยเหตุการณ์ งานที่เสร็จสมบูรณ์ในสองขั้นตอนนี้ส่วนใหญ่ใช้เพื่อดำเนินการคุณลักษณะต่างๆ ของวัตถุ HttpContext
ในที่สุดการประมวลผลคำขอ HTTP จะเสร็จสิ้นใน "ขั้นตอนการประมวลผล" โดยออบเจ็กต์ที่ใช้อินเทอร์เฟซ IHttpHandler ทุกคลาสของเพจที่สร้างโดยเว็บเพจ ASP.NET จะใช้อินเทอร์เฟซนี้ วัตถุ PageHandlerFactory [9] มีหน้าที่ในการสร้างวัตถุการประมวลผลคำขอ HTTP ที่เหมาะสม
จะเห็นได้ว่าออบเจ็กต์ที่ใช้อินเทอร์เฟซ IHttpHandler มีหน้าที่รับผิดชอบในการประมวลผลคำขอ HTTP ซึ่งเป็นสาเหตุที่เรียกว่า "ตัวจัดการ (ตัวจัดการ)"
นอกเหนือจากหน้าเว็บ ASP.NET ทั่วไปแล้ว วิศวกรซอฟต์แวร์เว็บยังสามารถสร้างอ็อบเจ็กต์ของตนเองที่ใช้อินเทอร์เฟซ IHttpHandler และแทรกลงในไปป์ไลน์ HTTP เพื่อจัดการคำขอ HTTP
เมื่อคำขอ HTTP ได้รับการประมวลผล ออบเจ็กต์ที่เกี่ยวข้องจะถูกเผยแพร่ แต่โดเมนแอปพลิเคชันที่สร้างขึ้น HttpApplication และออบเจ็กต์อื่น ๆ ยังคงอยู่เพื่อตอบสนองต่อการร้องขอ HTTP ถัดไป
7 สรุปวงจรชีวิตของแอปพลิเคชัน ASP.NET
ในส่วนนี้จะแนะนำวงจรชีวิตของแอปพลิเคชัน ASP.NET นี่เป็นกระบวนการที่ค่อนข้างซับซ้อน มันอาจจะง่ายกว่าที่จะเข้าใจด้วยการเปรียบเทียบที่เป็นที่นิยมต่อไปนี้:
l "ไปป์ไลน์การประมวลผลคำขอ HTTP" คือ "สายการประกอบการผลิต" ในโรงงานที่ทันสมัย และวัตถุ HttpContext เป็นผลิตภัณฑ์ที่จะประมวลผลบนสายการประกอบนี้
ล. วัตถุ HttpHandler (ตัวจัดการ HTTP) เป็นแกนหลักของ "สายการผลิตผลิตภัณฑ์" ทั้งหมดซึ่งมีหน้าที่รับผิดชอบในการประกอบผลิตภัณฑ์ให้เป็นรูปร่าง
l HttpModule (โมดูล HTTP) เทียบเท่ากับพนักงานเสริมใน "สายการผลิต" พวกเขาดำเนินการ "ก่อนการประมวลผล" (การเตรียมการประกอบผลิตภัณฑ์) และ "หลังการประมวลผล" (การเตรียมการส่งมอบผลิตภัณฑ์ เช่น การติดฉลาก) ผลิตภัณฑ์ (วัตถุ HttpContext) )
ล. วัตถุ HttpApplication คือ "ผู้นำ" ของ "สายการผลิต" ทั้งหมด เขามีหน้าที่รับผิดชอบในการจัดสรรคนงานให้กับ "สายการผลิต" (การเริ่มต้นและการโหลด HttpModules ที่ลงทะเบียนทั้งหมด) จากนั้นทริกเกอร์ชุดของเหตุการณ์ (เรียกว่า "ASP. NET application events" ") HttpModule เฉพาะมีหน้าที่รับผิดชอบในการตอบสนองต่อเหตุการณ์เฉพาะ
-------------------------------------------------- -------------------------------------------------- ----------------------------------
[1] หากไม่มีกระบวนการของผู้ปฏิบัติงาน โปรแกรมตรวจสอบ IIS WAS จะสร้างขึ้นมา มิฉะนั้น กระบวนการของผู้ปฏิบัติงานที่มีอยู่จะถูกนำมาใช้ซ้ำ
[2] ในโหมดรวม IIS 7 เนื่องจาก CLR ถูกโหลดไว้ล่วงหน้าแล้ว ขั้นตอนนี้จึงไม่จำเป็น
[3] "อินสแตนซ์ของคลาส" และ "วัตถุของคลาส" มีความหมายเหมือนกัน และทั้งคู่อ้างถึงวัตถุที่สร้างขึ้นโดยใช้คลาสเป็นเทมเพลต
[4] กลุ่มวัตถุ (กลุ่มวัตถุ) เป็นวิธีการจัดระเบียบวัตถุทั่วไปในระบบซอฟต์แวร์เชิงวัตถุ ถือได้ว่าเป็นคอนเทนเนอร์วัตถุ กลุ่มวัตถุมีหลายวัตถุที่สร้างขึ้นล่วงหน้า เมื่อโลกภายนอกต้องการวัตถุ มันก็สามารถนำวัตถุสำเร็จรูปออกจากพูลและใช้งานได้โดยตรง เพื่อหลีกเลี่ยงการสูญเสียประสิทธิภาพที่เกิดจากการสร้างวัตถุบ่อยครั้ง
[5] HttpApplication กำหนดเหตุการณ์บางอย่าง สำหรับรายการเหตุการณ์ทั้งหมด โปรดดู MSDN
[6] วิธีการนี้จะถูกเรียกโดยอัตโนมัติเมื่อได้รับวัตถุ HttpApplication
[7] โมดูล HTTP ทั้งหมดต้องใช้อินเทอร์เฟซ IHttpModule และวิธี Init() ถูกกำหนดโดยอินเทอร์เฟซนี้
[8] สามารถเพิ่มโมดูล HTTP ที่กำหนดเองลงในขั้นตอนการประมวลผลคำขอ HTTP ได้โดยการแทรกเนื้อหาเฉพาะใน Web.Config
[9] นี่เป็นอีกหนึ่งแกนหลักในกรอบงานเทคโนโลยี ASP.NET