-
คุณสามารถใช้ตัวควบคุมการทดแทนเพื่อสร้างพื้นที่บนเว็บเพจที่สามารถอัปเดตแบบไดนามิกและรวมเข้ากับเพจที่แคชไว้ในภายหลัง
1. แผน
ใช้ตัวควบคุมการแทนที่เพื่อระบุส่วนของเว็บเพจที่คุณต้องการแคชเอาต์พุตของเนื้อหาไดนามิก สำหรับเพจที่เนื้อหาส่วนใหญ่ถูกแคชไว้ การควบคุมการทดแทนจะให้วิธีแก้ปัญหาที่ง่ายขึ้นสำหรับการแคชเพจบางส่วน คุณสามารถแคชผลลัพธ์ของทั้งเพจ จากนั้นใช้ตัวควบคุมการทดแทนเพื่อระบุส่วนของเพจที่ไม่ถูกแคช พื้นที่แคชจะถูกดำเนินการเพียงครั้งเดียว และจะถูกอ่านจากแคชจนกว่ารายการแคชจะหมดอายุหรือถูกล้าง ขอบเขตไดนามิกจะถูกดำเนินการทุกครั้งที่มีการร้องขอเพจ โมเดลแคชนี้ช่วยลดความยุ่งยากในการเขียนโค้ดสำหรับเว็บเพจที่มีเนื้อหาส่วนใหญ่เป็นแบบคงที่ เนื่องจากคุณไม่จำเป็นต้องห่อหุ้มเนื้อหาแบบคงที่นี้ในการควบคุมผู้ใช้เว็บเพื่อใส่ไว้ในแคช ตัวอย่างเช่น โมเดลแคชนี้มีประโยชน์สำหรับหน้าเว็บที่มีเนื้อหาคงที่ (เช่น เรื่องราวข่าวสาร) และตัวควบคุม AdRotator ที่แสดงโฆษณา ข่าวสารไม่ได้เปลี่ยนแปลงบ่อยนัก ซึ่งหมายความว่าสามารถแคชได้ คุณอาจต้องการแสดงโฆษณาใหม่ทุกครั้งที่ผู้ใช้ร้องขอหน้าเว็บ การควบคุม AdRotator รองรับการแทนที่หลังแคชโดยตรง ซึ่งจะแสดงโฆษณาใหม่ในแต่ละ postback ของหน้าเว็บ ไม่ว่าหน้าเว็บนั้นจะถูกแคชหรือไม่ก็ตาม
2. ความเป็นมา
เมื่อคุณแคชเว็บเพจ ASP.NET ตามค่าเริ่มต้น ผลลัพธ์ทั้งหมดจากเพจจะถูกแคชไว้ ในคำขอแรก เพจจะทำงานและเอาต์พุตจะถูกแคช สำหรับคำขอครั้งต่อไป การดำเนินการนี้จะดำเนินการผ่านการแคช และโค้ดบนหน้านั้นจะไม่ทำงาน
ในบางกรณี คุณอาจต้องการไม่เพียงแคชเว็บเพจ ASP.NET แต่ยังอัปเดตส่วนที่เลือกของเพจทุกครั้งที่มีการร้องขอเพจด้วย ตัวอย่างเช่น คุณอาจต้องการแคชส่วนใหญ่ของเพจ แต่จำเป็นต้องอัปเดตข้อมูลที่ละเอียดอ่อนด้านเวลาในเพจแบบไดนามิก
คุณสามารถใช้ตัวควบคุมการทดแทนเพื่อแทรกเนื้อหาแบบไดนามิกลงในเพจที่แคชได้ การควบคุมการทดแทนไม่แสดงมาร์กอัปใดๆ ดังนั้น คุณจำเป็นต้องผูกตัวควบคุมกับวิธีการในเว็บเพจหรือการควบคุมผู้ใช้หลัก คุณต้องสร้างวิธีการคงที่ที่ส่งคืนข้อมูลที่จะแทรกลงในเว็บเพจ วิธีการเรียกโดยการควบคุมการเปลี่ยนตัวจะต้องเป็นไปตามเกณฑ์ต่อไปนี้:
·ต้องเป็นวิธีการแบบคงที่ (แชร์ใน Visual Basic)
·ต้องยอมรับพารามิเตอร์ประเภท HttpContext
·ต้องส่งคืนค่าประเภท String
การควบคุมการแทนที่ไม่สามารถเข้าถึงการควบคุมอื่นๆ บนหน้าเว็บได้ ซึ่งหมายความว่าคุณไม่สามารถตรวจสอบหรือเปลี่ยนแปลงค่าของการควบคุมอื่นๆ ได้ อย่างไรก็ตาม โค้ดสามารถเข้าถึงบริบทของเพจปัจจุบันโดยใช้พารามิเตอร์ที่ส่งผ่านไป
เมื่อเพจรัน ตัวควบคุมการทดแทนจะเรียกใช้เมธอดนี้ จากนั้นแทนที่ตัวควบคุมการแทนที่บนเพจด้วยค่าที่ส่งกลับจากเมธอด
ตัวอย่างรหัส
ตัวอย่างต่อไปนี้สาธิตวิธีการใช้ตัวควบคุมการทดแทนเพื่อสร้างเนื้อหาที่อัปเดตได้แบบไดนามิกบนเพจที่แคชไว้ โค้ดในเหตุการณ์ Load ของเพจจะอัปเดตตัวควบคุมป้ายกำกับตามเวลาปัจจุบัน เนื่องจากระยะเวลาแคชของเพจถูกตั้งค่าเป็น 60 วินาที ข้อความของตัวควบคุมป้ายกำกับจึงไม่เปลี่ยนแปลง แม้ว่าจะมีการร้องขอเพจหลายครั้งภายในระยะเวลา 60 วินาทีก็ตาม ตัวควบคุมการทดแทนบนเพจเรียกเมธอดคงที่ GetTime ซึ่งส่งกลับเวลาปัจจุบันเป็นสตริง แต่ละครั้งที่มีการรีเฟรชเว็บเพจ ค่าที่แสดงโดยตัวควบคุมการทดแทนจะได้รับการอัปเดต
<%@ ภาษาเพจ = "C#" %>
<%@ ระยะเวลา OutputCache=60 VaryByParam = "ไม่มี" %>
<script runat="เซิร์ฟเวอร์">
เป็นโมฆะ Page_Load()
-
Label1.Text = DateTime.Now.ToString();
-
GetTime สตริงคงที่สาธารณะ (บริบท HttpContext)
-
กลับ DateTime.Now.ToString();
-
</สคริปต์>
<html>
<หัว runat="เซิร์ฟเวอร์"></หัว>
<ร่างกาย>
<form id="form1" runat="server">
<div>
<p>
<asp:Label runat="server" ID="Label1" />
</p>
<p>
<asp:runat ทดแทน = "เซิร์ฟเวอร์"
รหัส = "ทดแทน 1"
MethodName = "GetTime" />
</p>
<p>
<asp:Button runat="server" ID="Button1" Text="ส่ง"/>
</p>
</div>
</แบบฟอร์ม>
</ร่างกาย>
</html>
3. ชั้นทดแทน
ใช้ตัวควบคุมการทดแทนเพื่อระบุส่วนของผลลัพธ์แคชเว็บเพจที่คุณต้องการแทนที่ตัวควบคุมด้วยเนื้อหาแบบไดนามิก ตัวควบคุมการทดแทนให้โซลูชันที่ง่ายขึ้นสำหรับการแคชเพจบางส่วนสำหรับเพจที่เนื้อหาส่วนใหญ่จะถูกแคช คุณสามารถส่งออกแคชทั้งเพจ จากนั้นใช้ตัวควบคุมการทดแทนเพื่อระบุส่วนของเพจที่ได้รับการยกเว้นจากการแคช พื้นที่ที่จำเป็นต้องแคชจะถูกดำเนินการเพียงครั้งเดียว จากนั้นอ่านจากแคชจนกว่ารายการแคชจะหมดอายุหรือถูกล้าง ขอบเขตไดนามิกจะถูกดำเนินการทุกครั้งที่มีการร้องขอเพจ โมเดลแคชนี้ช่วยลดความซับซ้อนของโค้ดสำหรับเพจที่มีเนื้อหาคงที่เป็นหลัก เนื่องจากส่วนเหล่านี้ไม่จำเป็นต้องถูกห่อหุ้มสำหรับการแคชในการควบคุมผู้ใช้เว็บ ตัวอย่างเช่น โมเดลแคชนี้จะมีประโยชน์หากหน้าเว็บมีเนื้อหาคงที่ (เช่น บทความข่าว) และตัวควบคุม AdRotator ที่แสดงโฆษณา บทความข่าวไม่มีการเปลี่ยนแปลง ซึ่งหมายความว่าสามารถแคชได้ อย่างไรก็ตาม คุณต้องการแสดงโฆษณาใหม่ทุกครั้งที่ผู้ใช้ร้องขอหน้าเว็บ การควบคุม AdRotator รองรับการแทนที่หลังแคชโดยตรง ซึ่งจะแสดงโฆษณาใหม่เมื่อเพจถูกโพสต์กลับ ไม่ว่าเพจนั้นจะถูกแคชหรือไม่ก็ตาม
หมายเหตุ: คุณสามารถวางการควบคุมการทดแทนไว้ในการควบคุมผู้ใช้ที่มีอยู่ในเพจแคช อย่างไรก็ตาม คุณไม่สามารถวางตัวควบคุมการทดแทนภายในตัวควบคุมผู้ใช้แคชผลลัพธ์ได้
เมื่อดำเนินการควบคุมการทดแทน วิธีการส่งกลับสตริงจะถูกเรียก สตริงที่ส่งคืนโดยวิธีนี้คือเนื้อหาที่จะแสดงที่ตำแหน่งของตัวควบคุมการทดแทนบนเพจ ใช้คุณสมบัติ MethodName เพื่อระบุชื่อของวิธีการโทรกลับที่จะเรียกเมื่อดำเนินการตัวควบคุมการทดแทน วิธีการโทรกลับที่ระบุต้องเป็นวิธีการคงที่ของเพจหรือการควบคุมผู้ใช้ที่ประกอบด้วยการควบคุมการทดแทน ลายเซ็นของวิธีการโทรกลับจะต้องตรงกับลายเซ็นของผู้รับมอบสิทธิ์ HttpResponseSubstitutionCallback ที่ยอมรับพารามิเตอร์ HttpContext และส่งกลับสตริง
หากต้องการดำเนินการแคชเอาต์พุตของเพจ คุณสามารถใช้คำสั่ง @OutputCache คลาส HttpCachePolicy หรือคุณสมบัติ Cache
อีกวิธีหนึ่งในการใช้ตัวควบคุมการทดแทนคือการใช้ผู้รับมอบสิทธิ์ HttpResponseSubstitutionCallback เพื่อใช้ลักษณะการแทนที่แคช นอกจากนี้ พฤติกรรมการแทนที่แคชยังสามารถนำไปใช้กับการควบคุมที่สนับสนุนฟังก์ชันการแทนที่แคชโดยตรง เช่น การควบคุม AdRotator
ตัวอย่าง
ตัวอย่างรหัสต่อไปนี้สาธิตวิธีการ declaratively เพิ่มตัวควบคุมการทดแทนไปยังเว็บเพจแคชผลลัพธ์ เมื่อเพจโหลด ผู้ใช้จะแสดงวันที่และเวลาปัจจุบันในแท็บ พื้นที่ของหน้านี้ถูกแคชและอัปเดตทุกๆ 60 วินาที เมื่อดำเนินการควบคุมการทดแทน วิธีการGetCurrentDateTimeจะถูกเรียก สตริงที่ส่งคืนโดย GetCurrentDateTime จะแสดงให้ผู้ใช้เห็น ส่วนนี้ของเพจไม่ได้ถูกแคชและอัปเดตทุกครั้งที่รีเฟรชเพจ
<%@ ระยะเวลาแคชเอาท์พุต = "60" varybyparam = "ไม่มี" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<สคริปต์ runat = "เซิร์ฟเวอร์" ภาษา = "C #">
เป็นโมฆะ Page_Load (ผู้ส่งวัตถุ System.EventArgs e)
-
// แสดงวันที่และเวลาปัจจุบันในป้ายกำกับ
// แคชเอาต์พุตใช้กับส่วนนี้ของเพจ
CachedDateLabel.Text = DateTime.Now.ToString();
-
// การควบคุมการทดแทนเรียกวิธีนี้เพื่อดึงข้อมูล
// วันที่และเวลาปัจจุบันของหน้านี้
// ได้รับการยกเว้นจากการแคชเอาต์พุต
สตริงสาธารณะ GetCurrentDateTime (บริบท HttpContext)
-
กลับ DateTime.Now.ToString ();
-
</สคริปต์>
<html>
<หัว runat="เซิร์ฟเวอร์">
<title>ตัวอย่างคลาสการทดแทน</title>
</หัว>
<ร่างกาย>
<form id="form1" runat="server">
<h3>ตัวอย่างคลาสการทดแทน</h3>
<p>ส่วนนี้ของหน้าไม่ได้ถูกแคช:</p>
<asp:substitution id="ทดแทน1"
methodname="GetCurrentDateTime"
runat="เซิร์ฟเวอร์">
</asp:การทดแทน>
<br />
<p>ส่วนนี้ของหน้าถูกแคชไว้:</p>
<asp:label id="CachedDateLabel"
runat="เซิร์ฟเวอร์">
</asp:ฉลาก>
<br /><br />
<asp:button id="RefreshButton"
ข้อความ = "รีเฟรชหน้า"
runat="เซิร์ฟเวอร์">
</asp:ปุ่ม>
</แบบฟอร์ม>
</ร่างกาย>