ในบทความนี้ เราจะกล่าวถึงวิธีการต่างๆ ในการถ่ายโอนข้อมูลระหว่างเพจ ASP.NET เราหวังว่านี่จะช่วยให้ทุกคนเข้าใจถึงประโยชน์และความสะดวกในการถ่ายโอนข้อมูลระหว่างเพจ ASP.NET ได้อย่างถูกต้อง
0. บทนำ
เว็บเพจไม่มีสถานะ เซิร์ฟเวอร์ถือว่าแต่ละคำขอมาจากผู้ใช้รายอื่น ดังนั้น สถานะของตัวแปรจะไม่ถูกเก็บไว้ระหว่างคำขอหลายรายการติดต่อกันสำหรับเพจเดียวกันหรือเมื่อเพจข้ามไป เมื่อออกแบบและพัฒนาระบบเว็บด้วย ASP.NET ปัญหาสำคัญที่พบคือทำอย่างไรจึงจะมั่นใจได้ว่าข้อมูลจะถูกส่งอย่างถูกต้อง ปลอดภัย และมีประสิทธิภาพระหว่างเพจต่างๆ Asp.net นำเสนอเทคโนโลยีที่หลากหลาย เช่น การจัดการสถานะเพื่อแก้ไขปัญหาในการเก็บรักษา และการส่งผ่านข้อมูล เรามาสำรวจวิธีการต่างๆ เพื่อแก้ไขปัญหานี้ภายใต้ .NET และโอกาสที่เกี่ยวข้องกัน
1. วิธีการต่างๆ และการวิเคราะห์การถ่ายโอนข้อมูลระหว่างเพจ ASP.NET
1.1 การใช้วิธี Querystring
QueryString เรียกอีกอย่างว่าสตริงการสืบค้น วิธีการนี้จะผนวกข้อมูลที่จะถ่ายโอนไปยังจุดสิ้นสุดของที่อยู่เว็บเพจ (URL) และถ่ายโอนข้อมูลนั้น ตัวอย่างเช่น เมื่อต้องการข้ามจากเพจ A.aspx ไปยังเพจ B.aspx คุณสามารถใช้เมธอด Request.Redirect("B.aspx? ชื่อพารามิเตอร์ = ค่าพารามิเตอร์") หรือคุณสามารถใช้ไฮเปอร์ลิงก์: หลังจากข้ามเพจแล้ว จะพร้อมใช้งานในหน้าเป้าหมาย Ruquest["parameter name"] เพื่อรับพารามิเตอร์ ข้อดีของการใช้เมธอด QuerySting คือใช้งานง่ายและไม่ใช้ทรัพยากรของเซิร์ฟเวอร์ ข้อเสียคือค่าที่ส่งผ่านจะแสดงบนแถบที่อยู่ของเบราว์เซอร์ โดยมีความเสี่ยงที่จะถูกแก้ไข และวัตถุไม่สามารถ ผ่านแล้ว สตริงการสืบค้นสามารถใช้ได้เมื่อร้องขอเพจผ่าน URL เท่านั้น
1.2 การใช้ฟิลด์ที่ซ่อนอยู่
ฟิลด์ที่ซ่อนไว้จะไม่แสดงในเบราว์เซอร์ของผู้ใช้ โดยทั่วไป ตัวควบคุมที่ซ่อนไว้จะถูกเพิ่มลงในเพจ เมื่อโต้ตอบกับเซิร์ฟเวอร์ ค่าจะถูกกำหนดให้กับตัวควบคุมที่ซ่อนอยู่และส่งไปยังหน้าถัดไป โดเมนที่ซ่อนไว้สามารถเป็นที่เก็บข้อมูลใดๆ ที่จัดเก็บไว้ในหน้าเว็บที่เกี่ยวข้องกับหน้าเว็บนั้นได้ เมื่อใช้ฟิลด์ที่ซ่อนอยู่เพื่อจัดเก็บค่า ให้ใช้: Hidden control.value=numeric value เมื่อนำค่าที่ได้รับออกมา ให้ใช้: Variable=hidden control.value ข้อดีของการใช้ฟิลด์ที่ซ่อนอยู่คือง่ายต่อการนำไปใช้ ฟิลด์ที่ซ่อนอยู่คือการควบคุม HTML มาตรฐาน และไม่ต้องใช้ตรรกะการเขียนโปรแกรมที่ซับซ้อน ช่องที่ซ่อนจะถูกจัดเก็บและอ่านบนเพจ ไม่จำเป็นต้องใช้ทรัพยากรเซิร์ฟเวอร์ใดๆ และเบราว์เซอร์และอุปกรณ์ไคลเอนต์เกือบทั้งหมดรองรับแบบฟอร์มที่มีช่องที่ซ่อนอยู่ ข้อเสียคือมีโครงสร้างการจัดเก็บข้อมูลน้อยและรองรับเฉพาะโครงสร้างข้อมูลแบบธรรมดาเท่านั้น ความจุในการจัดเก็บข้อมูลมีขนาดเล็กเนื่องจากถูกจัดเก็บไว้ในหน้าเพจเอง ดังนั้นจึงไม่สามารถเก็บค่าที่มากขึ้นได้ และข้อมูลจำนวนมากจะถูกบล็อกโดยไฟร์วอลล์และพรอกซี
1.3 วิวสเตท
ViewState เป็นฟิลด์ฟอร์มที่ซ่อนอยู่ซึ่งจัดการโดยกรอบงานเพจ ASP.NET เมื่อ ASP.NET ดำเนินการเพจ ค่า ViewState และการควบคุมทั้งหมดบนเพจจะถูกรวบรวมและจัดรูปแบบเป็นสตริงที่เข้ารหัส จากนั้นกำหนดให้กับคุณสมบัติ Value ของฟิลด์ฟอร์มที่ซ่อนอยู่ เมื่อใช้ ViewState เพื่อถ่ายโอนข้อมูล คุณสามารถใช้: ViewState ["variable name"]=ค่าตัวเลข เมื่อดึงข้อมูล ให้ใช้: Variable=ViewState["variable name"] ข้อดีของการใช้ ViewState คือ: ค่าจะถูกเก็บไว้โดยอัตโนมัติระหว่างคำขอหลายรายการสำหรับหน้าเดียวกัน ไม่จำเป็นต้องใช้ทรัพยากรฝั่งเซิร์ฟเวอร์ และการใช้งานนั้นง่ายดาย ค่าในสถานะมุมมองจะถูกแฮชและบีบอัด และเป็น เข้ารหัสสำหรับการใช้งาน Unicode และความปลอดภัยต้องการสูงกว่าการใช้ฟิลด์ที่ซ่อนอยู่ ข้อเสียคือเนื่องจาก ViewState ถูกเก็บไว้ในเพจเอง หากเก็บค่าที่มากกว่า ผู้ใช้อาจช้าลงเมื่อแสดงเพจและส่งเพจ . แม้ว่าสถานะการดูจะจัดเก็บข้อมูลในรูปแบบแฮช แต่ก็ยังสามารถแก้ไขได้
1.4 การใช้คุกกี้
คุกกี้สามารถถ่ายโอนข้อมูลจำนวนเล็กน้อยระหว่างเพจต่างๆ และสามารถจัดเก็บไว้ในไฟล์ข้อความบนไคลเอนต์หรือในหน่วยความจำของไคลเอนต์ วิธีคุกกี้เหมาะสำหรับการจัดเก็บข้อมูลที่เปลี่ยนแปลงบ่อยครั้งในจำนวนหน้าเล็กๆ เช่น การบันทึกชื่อผู้ใช้สำหรับเข้าสู่ระบบสำหรับเว็บไซต์ที่เข้าสู่ระบบ ให้ความสะดวกแก่ผู้ใช้ในการป้อนข้อมูล และบันทึกการตั้งค่าส่วนบุคคลของผู้ใช้ในบางรายการที่ผู้ใช้กำหนด ใช้งานได้เมื่อใช้คุกกี้เพื่อถ่ายโอนข้อมูล: Response.Cookies["key name"]=key value; เพื่อดึงข้อมูล: ชื่อตัวแปร=Request.Cookies["key name"] ข้อดีของการใช้คุกกี้คือ: คุกกี้จะถูกจัดเก็บไว้ในไคลเอนต์ ไม่ใช้ทรัพยากรเซิร์ฟเวอร์ ใช้งานง่าย และสามารถกำหนดเวลาหมดอายุได้ ข้อเสีย: ปริมาณข้อมูลที่สามารถจัดเก็บได้ค่อนข้างน้อย เนื่องจากเบราว์เซอร์บางประเภทไม่รองรับคุกกี้และอาจถูกแบนหรือลบโดยผู้ใช้ จึงไม่สามารถใช้บันทึกข้อมูลสำคัญได้ นอกจากนี้ คุกกี้จะถูกจัดเก็บในรูปแบบข้อความธรรมดา และไม่เหมาะที่จะจัดเก็บข้อมูลที่ละเอียดอ่อนและไม่ได้เข้ารหัสไว้ในคุกกี้
1.5 การใช้ตัวแปรแอปพลิเคชัน
ตัวแปรแอปพลิเคชันยังสามารถใช้ถ่ายโอนค่าระหว่างเพจต่างๆ ได้ และผู้ใช้ทุกคนจะแชร์ตัวแปรแอปพลิเคชันเมื่อกำหนดแล้วจะส่งผลต่อทุกส่วนของโปรแกรม หากคุณต้องการใช้ค่าตัวแปรที่แน่นอนทั่วทั้งแอปพลิเคชัน Application object จะเป็นตัวเลือกที่ดีที่สุด เมื่อจัดเก็บข้อมูล ให้เพิ่มค่าให้กับตัวแปร Application: Application["variable name"]=numeric value; ใช้เพื่อดึงข้อมูล: Variable=Application["variable name"]; อย่างชัดเจน :Application["quantity name"]=null
ข้อดีของแอปพลิเคชัน: ใช้งานง่าย ครอบคลุมทั่วโลก ใช้ได้กับทุกหน้าในแอปพลิเคชัน ข้อเสีย: หากกระบวนการฝั่งเซิร์ฟเวอร์ที่บันทึกข้อมูลเสียหาย (เช่น เนื่องจากเซิร์ฟเวอร์ขัดข้อง อัปเกรด หรือปิดระบบ) ข้อมูลจะสูญหาย ดังนั้นคุณต้องมีกลยุทธ์ที่รับประกันเมื่อใช้แอปพลิเคชันนั้นจะใช้หน่วยความจำฝั่งเซิร์ฟเวอร์ ซึ่งอาจส่งผลต่อประสิทธิภาพของเซิร์ฟเวอร์และความสามารถในการปรับขนาดแอปพลิเคชัน
1.6 การใช้ตัวแปรเซสชัน
อ็อบเจ็กต์เซสชันสามารถใช้เพื่อจัดเก็บข้อมูลเกี่ยวกับการสนทนาที่ระบุซึ่งจำเป็นต้องได้รับการดูแล ไคลเอนต์ที่แตกต่างกันสร้างอ็อบเจ็กต์เซสชันที่แตกต่างกัน เซสชันใช้เพื่อจัดเก็บข้อมูลระยะสั้นเฉพาะสำหรับแต่ละเซสชัน การใช้งานและรูปแบบของ Session เหมือนกับ Application
ข้อดี: ใช้งานง่าย ให้ความปลอดภัยและความทนทานสูง สามารถรับมือกับการรีสตาร์ท IIS และการรีสตาร์ทกระบวนการเสริม และสามารถใช้ได้ในหลายกระบวนการ ข้อเสียคือใช้หน่วยความจำฝั่งเซิร์ฟเวอร์ ดังนั้นอย่าเก็บข้อมูลไว้เยอะ การใช้งานเซสชันที่พบบ่อยที่สุดคือการให้ฟังก์ชันการระบุผู้ใช้แก่แอปพลิเคชันบนเว็บร่วมกับคุกกี้ เซสชันยังสามารถใช้ในเบราว์เซอร์ที่ไม่รองรับคุกกี้ อย่างไรก็ตาม การใช้เซสชันที่ไม่มีคุกกี้จำเป็นต้องวางตัวระบุเซสชันในสตริงการสืบค้น ซึ่งประสบปัญหาด้านความปลอดภัยที่ระบุไว้ในส่วนสตริงการสืบค้นของบทความนี้ด้วย
1.7 การใช้คุณสมบัติคงที่ของคลาส
วิธีนี้ใช้คุณสมบัติคงที่ของคลาสเพื่อถ่ายโอนค่าระหว่างสองเพจ กำหนดคลาสที่มีคุณลักษณะคงที่ กำหนดค่าที่จะถ่ายโอนไปยังคุณลักษณะคงที่ หน้าเป้าหมายสามารถรับค่าที่จะถ่ายโอนในหน้าต้นทางผ่านคุณลักษณะคงที่
ข้อดีคือสามารถส่งข้อมูลหลายรายการได้อย่างง่ายดาย แต่ข้อเสียคือต้องมีการเขียนโปรแกรมเพิ่มเติม เพิ่มภาระงานในการเขียนโปรแกรม และใช้หน่วยความจำเซิร์ฟเวอร์
1.8 การใช้เซิร์ฟเวอร์ถ่ายโอน
ในขณะที่ถ่ายโอนโฟลว์การดำเนินการจากไฟล์ ASPX ปัจจุบันไปยังเพจ ASPX อื่นบนเซิร์ฟเวอร์เดียวกันผ่านเมธอด Server.Transfer ข้อมูลฟอร์มหรือสตริงการสืบค้นสามารถคงไว้ได้ วิธีนี้คือการตั้งค่าพารามิเตอร์ตัวที่สองของเมธอดให้เป็น True หน้าแรกใช้ Server.Transfer("target page name.aspx", true); หน้าเป้าหมายใช้: Ruquest.Form["Control Name"] หรือ Ruquest.QueryString["Control Name"] เพื่อดึงข้อมูล นอกจากนี้ยังสามารถนำมาใช้ใน Asp.net2.0 ได้ด้วย โดยมีโค้ดดังนี้
ก่อนหน้าหน้า pg1;
pg1=(หน้าก่อนหน้า)บริบท.ตัวจัดการ;
การตอบกลับเขียน (pg1.Name);
คำอธิบาย: รหัสนี้ใช้เพื่อดึงค่าที่ส่งผ่านจากเพจเป้าหมาย หน้าก่อนหน้า คือชื่อคลาสของเพจต้นฉบับ ชื่อ คือแอ็ตทริบิวต์ที่กำหนดไว้บนเพจต้นฉบับ และข้อมูลที่ต้องการถ่ายโอนจะถูกเก็บไว้ในนี้ คุณลักษณะ.
เมื่อใช้วิธีการนี้ คุณจะต้องเขียนโค้ดเพื่อสร้างคุณสมบัติบางอย่างเพื่อให้คุณสามารถเข้าถึงได้จากหน้าอื่น คุณสามารถเข้าถึงค่าเป็นคุณสมบัติของวัตถุในหน้าอื่นได้ วิธีนี้จะมีประโยชน์อย่างยิ่งในการส่งค่าระหว่างหน้าต่างๆ วิธีการนี้ไม่เพียงแต่ง่ายเท่านั้น แต่ยังเป็นแบบเชิงวัตถุด้วย
1.9 แคช
แคชมีฟังก์ชันการดำเนินการข้อมูลที่มีประสิทธิภาพ โดยจะจัดเก็บข้อมูลในรูปแบบของชุดคู่คีย์-ค่า สามารถแทรกและดึงข้อมูลได้โดยการระบุคำสำคัญ ความสามารถในการยุติการพึ่งพาช่วยให้สามารถควบคุมวิธีอัปเดตและกำจัดข้อมูลในแคชได้อย่างแม่นยำอย่างทันท่วงที สามารถดำเนินการจัดการล็อคภายใน และไม่จำเป็นต้องใช้เมธอด Lock() และ Unlock() สำหรับการจัดการซีเรียลไลซ์เซชัน เช่น ออบเจ็กต์แอปพลิเคชัน ข้อเสียคือวิธีการใช้งานมีความซับซ้อนและการใช้งานที่ไม่เหมาะสมจะทำให้ประสิทธิภาพลดลง
2. วิธีการถ่ายโอนค่าที่สามารถนำไปใช้ในสถานการณ์การข้ามหน้าที่แตกต่างกัน
2.1 สถานการณ์ที่ 1: เพจต้นทางสามารถข้ามไปยังเพจเป้าหมาย และเพจต้นทางส่งข้อมูลไปยังเพจเป้าหมาย
การใช้สตริงการสืบค้นเป็นวิธีที่ง่ายและใช้กันทั่วไปในการถ่ายโอนข้อมูลจำนวนเล็กน้อยจากหน้าหนึ่งไปยังอีกหน้าหนึ่ง และไม่มีปัญหาด้านความปลอดภัย ให้ใช้วิธี Server.Transfer เพื่อส่งข้อมูลแบบฟอร์มหรือสตริงการสืบค้นไปยังหน้าอื่น HttpContext ของเพจเริ่มต้น วิธีการนี้สามารถใช้ได้เมื่อเพจเป้าหมายและเพจต้นฉบับอยู่บนเซิร์ฟเวอร์เดียวกัน
2.2 กรณีที่ 2: เพจส่งค่าไปยังเพจของตัวเอง
นั่นคือด้วยการรักษาค่าไว้ในคำขอหลายรายการสำหรับหน้าเดียวกัน คุณสมบัติ ViewState จึงมอบฟังก์ชันการทำงานที่มีการรักษาความปลอดภัยขั้นพื้นฐาน ช่องที่ซ่อนไว้ยังสามารถใช้เพื่อจัดเก็บข้อมูลเพจจำนวนเล็กน้อยที่โพสต์กลับไปยังหน้านั้นเองหรือหน้าอื่น และใช้เมื่อไม่พิจารณาปัญหาด้านความปลอดภัย
2.3 กรณีที่ 3: เพจต้นทางส่งผ่านค่าไปยังเพจเป้าหมาย แต่เพจต้นทางไม่สามารถเชื่อมต่อโดยตรงกับเพจเป้าหมายได้
มีหลายวิธี และวิธีใดที่จะใช้ขึ้นอยู่กับสถานการณ์เฉพาะ
แอปพลิเคชัน: จัดเก็บข้อมูลส่วนกลางที่ผู้ใช้หลายคนใช้และเปลี่ยนแปลงไม่บ่อยนัก เมื่อความปลอดภัยไม่ใช่ปัญหา อย่าเก็บข้อมูลจำนวนมาก เซสชัน: จัดเก็บข้อมูลระยะสั้นที่เฉพาะเจาะจงสำหรับแต่ละเซสชันและต้องการความปลอดภัยสูง อย่าเก็บข้อมูลจำนวนมากไว้ในสถานะเซสชัน โปรดทราบว่าออบเจ็กต์สถานะเซสชันจะถูกสร้างขึ้นและดูแลรักษาตลอดอายุการใช้งานของแต่ละเซสชันในแอปพลิเคชัน ในแอปพลิเคชันที่รองรับผู้ใช้จำนวนมาก สิ่งนี้อาจใช้ทรัพยากรเซิร์ฟเวอร์จำนวนมากและส่งผลกระทบต่อความสามารถในการขยายขนาด
คุกกี้: ใช้เมื่อคุณต้องการจัดเก็บข้อมูลจำนวนเล็กน้อยบนฝั่งไคลเอ็นต์และไม่มีปัญหาด้านความปลอดภัย คุณลักษณะแบบคงที่ของคลาสอำนวยความสะดวกในการส่งข้อมูลหลายรายการ
แคช: ออบเจ็กต์สำหรับผู้ใช้คนเดียว กลุ่มผู้ใช้ หรือผู้ใช้ทั้งหมด สามารถบันทึกข้อมูลสำหรับคำขอหลายรายการได้เป็นเวลานานและมีประสิทธิภาพ วิธีการข้างต้นไม่ได้ใช้เฉพาะในกรณีที่สามเท่านั้น แต่ยังใช้ในสองกรณีก่อนหน้านี้ด้วย เพียงใช้ให้น้อยที่สุดเท่าที่จะเป็นไปได้เมื่อไม่จำเป็น มิฉะนั้นจะทำให้สิ้นเปลืองทรัพยากรหรือเพิ่มความซับซ้อนของโปรแกรม