ความแตกต่างระหว่างServer.Transfer
และResponse.Redirect
คืออะไร?
- ข้อดีและข้อเสียของแต่ละข้อคืออะไร
- เมื่อใดที่เหมาะสมกว่าอีก?
- เมื่อใดที่ไม่เหมาะสม
Server.TransferRequest
Server.Transfer
ความแตกต่างระหว่างServer.Transfer
และResponse.Redirect
คืออะไร?
Server.TransferRequest
Server.Transfer
คำตอบ:
Response.Redirect
เพียงส่งข้อความ(HTTP 302)ลงไปที่เบราว์เซอร์
Server.Transfer
เกิดขึ้นโดยที่เบราว์เซอร์ไม่ทราบอะไรเลยเบราว์เซอร์ร้องขอหน้าเว็บ แต่เซิร์ฟเวอร์ส่งคืนเนื้อหาของอีกหน้าหนึ่ง
Response.Redirect()
จะส่งคุณไปยังหน้าใหม่อัปเดตแถบที่อยู่และเพิ่มลงในประวัติเบราว์เซอร์ บนเบราว์เซอร์ของคุณคุณสามารถคลิกกลับ
Server.Transfer()
ไม่เปลี่ยนแถบที่อยู่ คุณไม่สามารถตีกลับ
ฉันใช้Server.Transfer()
เมื่อฉันไม่ต้องการให้ผู้ใช้เห็นว่าฉันกำลังจะไปที่ไหน บางครั้งในหน้าประเภท "กำลังโหลด"
Response.Redirect()
มิฉะนั้นฉันมักจะใช้
To be Short: Response.Redirect
เพียงบอกเบราว์เซอร์ให้ไปที่หน้าอื่น Server.Transfer
ช่วยลดคำขอของเซิร์ฟเวอร์รักษา URL ให้เหมือนเดิมและด้วยการกดปุ่มบั๊กเล็กน้อยช่วยให้คุณถ่ายโอนสตริงแบบสอบถามและตัวแปรแบบฟอร์ม
สิ่งที่ฉันพบและเห็นด้วยกับ (ที่มา ):
Server.Transfer
Server.Transfer("WebForm2.aspx")
จะคล้ายกันในการที่จะส่งผู้ใช้ไปยังหน้าอื่นที่มีคำสั่งดังกล่าวเป็น อย่างไรก็ตามคำสั่งมีจำนวนข้อดีและข้อเสียที่แตกต่างกันประการแรกการถ่ายโอนไปยังหน้าอื่นโดยใช้การ
Server.Transfer
อนุรักษ์ทรัพยากรเซิร์ฟเวอร์ แทนที่จะบอกให้เบราว์เซอร์เปลี่ยนเส้นทางเพียงเปลี่ยน "โฟกัส" บนเว็บเซิร์ฟเวอร์และถ่ายโอนคำขอ ซึ่งหมายความว่าคุณจะไม่ได้รับคำขอ HTTP จำนวนมากซึ่งจะช่วยลดความกดดันในเว็บเซิร์ฟเวอร์ของคุณและทำให้แอปพลิเคชันของคุณทำงานได้เร็วขึ้นแต่ระวัง: เนื่องจากกระบวนการ "ถ่ายโอน" สามารถทำงานบนไซต์ที่ทำงานบนเซิร์ฟเวอร์เท่านั้น คุณไม่สามารถใช้
Server.Transfer
ส่งผู้ใช้ไปยังไซต์ภายนอก เพียง แต่Response.Redirect
สามารถทำเช่นนั้นประการที่สอง
Server.Transfer
รักษา URL ดั้งเดิมในเบราว์เซอร์ สิ่งนี้สามารถช่วยปรับปรุงเทคนิคการป้อนข้อมูลได้อย่างมีประสิทธิภาพแม้ว่าอาจทำให้สับสนเมื่อทำการดีบั๊กนั่นไม่ใช่ทั้งหมด:
Server.Transfer
เมธอดยังมีพารามิเตอร์ตัวที่สอง - "maintainForm" หากคุณตั้งค่านี้เป็นTrue
โดยใช้คำสั่งเช่นServer.Transfer("WebForm2.aspx", True)
สตริงการสืบค้นที่มีอยู่และตัวแปรรูปแบบใด ๆ จะยังคงมีอยู่ในเพจที่คุณกำลังถ่ายโอนไปตัวอย่างเช่นถ้าคุณมี WebForm1.aspx กล่องข้อความควบคุมที่เรียกว่า TextBox1 และคุณโอนไป WebForm2.aspx กับชุดพารามิเตอร์ preserveForm เพื่อ True
Request.Form("TextBox1")
คุณจะสามารถดึงค่าของตัวควบคุมกล่องข้อความหน้าเดิมโดยการอ้างอิง
maintaining the original URL... ...really help streamline data entry techniques
อย่างไร
Response.Redirect()
ควรใช้เมื่อ:
Server.Transfer()
ควรใช้เมื่อ:
Response.Redirect เปลี่ยนเส้นทางหน้าไปยังหน้าอื่นหลังจากหน้าแรกมาถึงลูกค้า ดังนั้นลูกค้ารู้ว่าการเปลี่ยนเส้นทาง
Server.Transfer ออกจากการดำเนินการปัจจุบันของหน้า ลูกค้าไม่รู้จักการเปลี่ยนเส้นทาง จะช่วยให้คุณถ่ายโอนสตริงแบบสอบถามและตัวแปรแบบฟอร์ม
ดังนั้นมันขึ้นอยู่กับความต้องการของคุณในการเลือกที่ดีกว่า
Response.Redirect
เพื่อโหลดหน้าต้นฉบับได้แม้ว่าฉันได้เรียกไปแล้วResponse.Redirect
หรือไม่
"response.redirect" และ "server.transfer" ช่วยในการถ่ายโอนผู้ใช้จากหน้าหนึ่งไปยังหน้าอื่นในขณะที่หน้ากำลังดำเนินการ แต่วิธีการถ่ายโอน / เปลี่ยนเส้นทางนี้แตกต่างกันมาก
ในกรณีที่คุณเป็นคนที่มองเห็นและต้องการดูการสาธิตมากกว่าทฤษฎีฉันขอแนะนำให้ดูวิดีโอ Facebook ด้านล่างซึ่งอธิบายความแตกต่างในแบบที่ชัดเจนยิ่งขึ้น
https://www.facebook.com/photo.php?v=762186150488997
ความแตกต่างที่สำคัญระหว่างพวกเขาคือผู้ที่โอน ใน "response.redirect" การถ่ายโอนจะทำโดยเบราว์เซอร์ในขณะที่อยู่ใน "server.transfer" จะทำโดยเซิร์ฟเวอร์ ให้เราพยายามเข้าใจคำแถลงนี้อย่างละเอียดยิ่งขึ้น
ใน "Server.Transfer" ต่อไปนี้เป็นลำดับของการถ่ายโอนที่เกิดขึ้น: -
1. ผู้ใช้ส่งคำขอไปยังเพจ ASP.NET ในรูปด้านล่างคำขอถูกส่งไปที่ "WebForm1" และเราต้องการนำทางไปยัง "Webform2"
2.Server เริ่มทำงาน "Webform1" และวงจรชีวิตของหน้าเริ่มต้นขึ้น แต่ก่อนที่วงจรชีวิตที่สมบูรณ์ของหน้านั้นจะเสร็จสมบูรณ์“ Server.transfer” จะเกิดขึ้นกับ "WebForm2"
3. วัตถุหน้า "Webform2" ถูกสร้างขึ้นวงจรชีวิตเต็มหน้าจะถูกดำเนินการและการตอบสนอง HTML เอาท์พุทจะถูกส่งไปยังเบราว์เซอร์
ในขณะที่ "Response.Redirect" ต่อไปนี้เป็นลำดับเหตุการณ์สำหรับการนำทาง: -
1.Client (เบราว์เซอร์) ส่งคำขอไปยังหน้า ในรูปด้านล่างคำขอถูกส่งไปที่ "WebForm1" และเราต้องการนำทางไปยัง "Webform2"
2. วงจรชีวิตของ "Webform1" เริ่มดำเนินการ แต่ในระหว่างวงจรชีวิต "Response.Redirect" เกิดขึ้น
3. ตอนนี้แทนที่จะเซิร์ฟเวอร์เปลี่ยนเส้นทางเขาส่งคำสั่ง HTTP 302 ไปยังเบราว์เซอร์ คำสั่งนี้บอกเบราว์เซอร์ว่าเขาต้องเริ่มต้นคำขอ GET ไปที่หน้า "Webform2.aspx"
4.Browser ตีความคำสั่ง 302 และส่งคำขอ GET สำหรับ "Webform2.aspx"
กล่าวอีกนัยหนึ่งคือ "เซิร์ฟเวอร์การถ่ายโอน" จะถูกดำเนินการโดยเซิร์ฟเวอร์ในขณะที่ "การตอบสนองการเปลี่ยนเส้นทาง" จะถูกดำเนินการโดยเบราว์เซอร์ thr "Response.Redirect" ต้องมีสองคำขอในการเปลี่ยนเส้นทางของหน้า
ดังนั้นเมื่อใดควรใช้ "Server.Transfer" และเมื่อใดควรใช้ "Response.Redirect"?
ใช้ "Server.Transfer" เมื่อคุณต้องการนำทางหน้าเว็บที่อยู่บนเซิร์ฟเวอร์เดียวกันใช้ "Response.Redirect" เมื่อคุณต้องการนำทางระหว่างหน้าเว็บที่อยู่บนเซิร์ฟเวอร์และโดเมนที่ต่างกัน
ด้านล่างเป็นตารางสรุปที่แสดงความแตกต่างและสถานการณ์ที่จะใช้
Server.Transfer
: เซิร์ฟเวอร์เดียวกันหรือเว็บไซต์ IIS เดียวกันหรือไม่
ความสวยงามของ Server.Transfer คือสิ่งที่คุณสามารถทำได้:
TextBox myTxt = (TextBox)this.Page.PreviousPage.FindControl("TextBoxID");
คุณสามารถได้อะไรจากหน้าก่อนหน้าของคุณโดยใช้วิธีการด้านบนตราบใดที่คุณใช้ Server.Transfer แต่ไม่ใช่ Response.Redirect
นอกจากความคิดเห็นของ ScarletGarden แล้วคุณต้องพิจารณาผลกระทบของเครื่องมือค้นหาและการเปลี่ยนเส้นทางของคุณด้วย หน้านี้ย้ายอย่างถาวรหรือไม่? ชั่วคราว? มันสร้างความแตกต่าง
ดู: Response.Redirect vs. "301 Moved อย่างถาวร" :
เราทุกคนใช้ Response.Redirect พร้อมกัน มันเป็นวิธีที่รวดเร็วและง่ายดายในการทำให้ผู้มาเยี่ยมชมชี้ไปในทิศทางที่ถูกต้องหากพวกเขาลงเอยที่ผิด แต่คุณทราบหรือไม่ว่า Response.Redirect ส่งรหัสสถานะการตอบกลับ HTTP ของ "302 Found" เมื่อคุณอาจต้องการส่ง "301 Moved อย่างถาวร"
ความแตกต่างนั้นดูเล็ก แต่ในบางกรณีมันสามารถสร้างความแตกต่างได้อย่างมาก ตัวอย่างเช่นหากคุณใช้รหัสตอบสนอง "301 ย้ายอย่างถาวร" เครื่องมือค้นหาส่วนใหญ่จะลบลิงก์ที่ล้าสมัยออกจากดัชนีและแทนที่ด้วยลิงก์ใหม่ หากคุณใช้ "พบ 302" พวกเขาจะกลับไปที่หน้าเก่าต่อไป ...
การถ่ายโอนเป็นฝั่งเซิร์ฟเวอร์ทั้งหมด แถบที่อยู่ลูกค้าคงที่ ความซับซ้อนบางอย่างเกี่ยวกับการถ่ายโอนบริบทระหว่างคำขอ การล้างและรีสตาร์ทตัวจัดการเพจอาจมีราคาแพงดังนั้นการถ่ายโอนของคุณในช่วงต้นเช่นใน HttpModule ในช่วง BeginRequest อ่านเอกสาร MSDN อย่างระมัดระวังและทดสอบและทำความเข้าใจกับค่าใหม่ของ HttpContext.Request - โดยเฉพาะในสถานการณ์ Postback เรามักจะใช้ Server.Transfer สำหรับสถานการณ์ข้อผิดพลาด
การเปลี่ยนเส้นทางยกเลิกการร้องขอด้วยสถานะ 302 และการตอบกลับลูกค้าฝั่งด้วยและภายในได้รับการยกเว้น (เซิร์ฟเวอร์จำนวนเยี่ยมชมน้อย - ขึ้นอยู่กับจำนวนวันที่คุณทำ) ลูกค้าจะนำทางไปยังที่อยู่ใหม่ การอัปเดตแถบที่อยู่ของเบราว์เซอร์และประวัติอื่น ๆ ลูกค้าชำระค่าใช้จ่ายในการไปกลับพิเศษ - ราคาจะแตกต่างกันไปขึ้นอยู่กับเวลาในการตอบสนอง ในธุรกิจของเราเราเปลี่ยนเส้นทางมากเราเขียนโมดูลของเราเองเพื่อหลีกเลี่ยงข้อยกเว้นค่าใช้จ่าย
มีความแตกต่างมากมายตามที่ระบุไว้ข้างต้น นอกเหนือจากข้างต้นมีความแตกต่างอีกอย่างหนึ่งคือ Response.Redirect()
สามารถใช้เพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าใด ๆ ที่ไม่ได้เป็นส่วนหนึ่งของแอปพลิเคชัน แต่Server.Transfer()
สามารถใช้เพื่อเปลี่ยนเส้นทางผู้ใช้ภายในแอปพลิเคชันเท่านั้น
//This will work.
Response.Redirect("http://www.google.com");
//This will not work.
Server.Transfer("http://www.google.com");
Response.Redirect นั้นมีค่าใช้จ่ายสูงกว่าเพราะจะเพิ่มทริปพิเศษไปยังเซิร์ฟเวอร์เพื่อหาว่าจะไปที่ไหน
Server.Transfer มีประสิทธิภาพมากขึ้น แต่อาจนำไปสู่การเข้าใจผิดเล็กน้อยต่อผู้ใช้เนื่องจาก Url ไม่เปลี่ยนแปลงทางร่างกาย
จากประสบการณ์ของฉันความแตกต่างในประสิทธิภาพไม่ได้มีนัยสำคัญเพียงพอที่จะใช้วิธีการหลัง
Server.Transfer จะไม่เปลี่ยน URL ในเบราว์เซอร์ไคลเอ็นต์ดังนั้นประสิทธิภาพของเบราว์เซอร์จึงไม่ทราบว่าคุณเปลี่ยนไปเป็นตัวจัดการฝั่งเซิร์ฟเวอร์อื่น Response.Redirect บอกให้เบราว์เซอร์ย้ายไปที่หน้าอื่นดังนั้น URL ในแถบหัวเรื่องจึงเปลี่ยนไป
Server.Transfer เร็วขึ้นเล็กน้อยเนื่องจากหลีกเลี่ยงการไปหนึ่งครั้งที่เซิร์ฟเวอร์ แต่การเปลี่ยน URL อาจไม่ดีหรือไม่ดีสำหรับคุณทั้งนี้ขึ้นอยู่กับสิ่งที่คุณพยายามทำ
Response.Redirect:บอกเบราว์เซอร์ว่าหน้าเว็บที่ร้องขอสามารถพบได้ในตำแหน่งใหม่ จากนั้นเบราว์เซอร์จะเริ่มต้นคำขออื่นไปยังหน้าใหม่ที่โหลดเนื้อหาในเบราว์เซอร์ เบราว์เซอร์นี้มีคำขอสองคำขอ
Server.Transfer:มันถ่ายโอนการดำเนินการจากหน้าแรกไปยังหน้าสองบนเซิร์ฟเวอร์ เท่าที่เบราว์เซอร์ไคลเอนต์เกี่ยวข้องมันทำคำขอเดียวและหน้าเริ่มต้นคือหน้าที่ตอบกลับด้วยเนื้อหา ข้อดีของวิธีนี้คือการเดินทางไปกลับจากเซิร์ฟเวอร์ในเบราว์เซอร์ไคลเอ็นต์น้อยลง นอกจากนี้ตัวแปรฟอร์มใด ๆ ที่โพสต์และพารามิเตอร์สตริงการสืบค้นจะพร้อมใช้งานในเพจที่สองเช่นกัน
รายละเอียดเพิ่มเติมเกี่ยวกับ Transfer () จริง ๆ แล้วก็คือ Server.Execute () + Response.End () ซอร์สโค้ดของมันอยู่ด้านล่าง (จาก Mono / .net 4.0):
public void Transfer (string path, bool preserveForm)
{
this.Execute (path, null, preserveForm, true);
this.context.Response.End ();
}
และสำหรับ Execute () สิ่งที่ต้องใช้คือตัวจัดการเส้นทางที่กำหนดให้ดู
ASP.NET ไม่ตรวจสอบว่าผู้ใช้ปัจจุบันได้รับอนุญาตให้ดูทรัพยากรที่จัดส่งโดยวิธีการดำเนินการ แม้ว่าตรรกะการอนุญาตและการรับรองความถูกต้องของ ASP.NET จะทำงานก่อนที่จะเรียกใช้ตัวจัดการทรัพยากรดั้งเดิม ASP.NET จะเรียกตัวจัดการที่ระบุโดยวิธีการดำเนินการโดยตรง หากนโยบายความปลอดภัยของแอปพลิเคชันของคุณต้องการให้ลูกค้ามีสิทธิ์ที่เหมาะสมในการเข้าถึงทรัพยากรแอปพลิเคชันควรบังคับให้มีการให้สิทธิ์อีกครั้งหรือให้กลไกการควบคุมการเข้าถึงที่กำหนดเอง
คุณสามารถบังคับให้มีการให้สิทธิ์อีกครั้งโดยใช้วิธีการเปลี่ยนเส้นทางแทนวิธีดำเนินการ การเปลี่ยนเส้นทางทำการเปลี่ยนเส้นทางฝั่งไคลเอ็นต์ซึ่งเบราว์เซอร์ร้องขอทรัพยากรใหม่ เนื่องจากการเปลี่ยนเส้นทางนี้เป็นคำขอใหม่ที่เข้าสู่ระบบจึงอยู่ภายใต้ตรรกะการตรวจสอบและการอนุญาตทั้งหมดของนโยบายความปลอดภัยของ Internet Information Services (IIS) และ ASP.NET
- จาก MSDN
Response.Redirect เป็นการเดินทางไปกลับพิเศษและอัปเดตแถบที่อยู่
Server.Transfer ไม่ทำให้แถบที่อยู่เปลี่ยนแปลงเซิร์ฟเวอร์ตอบกลับคำขอด้วยเนื้อหาจากหน้าอื่น
เช่น
Response.Redirect: -
Server.Transfer: -
Response.Redirect
จุดเด่น: - สงบ - มันเปลี่ยนแถบที่อยู่ที่อยู่สามารถใช้ในการบันทึกการเปลี่ยนแปลงของรัฐในระหว่างการร้องขอ
ข้อด้อย: - ช้า - มีการไปกลับพิเศษระหว่างไคลเอนต์และเซิร์ฟเวอร์ ซึ่งอาจมีราคาแพงเมื่อมีเวลาแฝงมากระหว่างไคลเอนต์และเซิร์ฟเวอร์
Server.Transfer
จุดเด่น: - รวดเร็ว
ข้อด้อย: - สถานะสูญหาย - หากคุณใช้เซิร์ฟเวอร์โอนย้ายเพื่อเปลี่ยนสถานะของแอปพลิเคชันเพื่อตอบกลับหลังโพสต์หากหน้านั้นโหลดใหม่สถานะนั้นจะหายไปเนื่องจากแถบที่อยู่จะเหมือนเดิม ในคำขอแรก
Response.Redirect Response.Redirect () จะส่งคุณไปยังหน้าใหม่อัปเดตแถบที่อยู่และเพิ่มไปยังประวัติเบราว์เซอร์ บนเบราว์เซอร์ของคุณคุณสามารถคลิกกลับ มันเปลี่ยนเส้นทางการร้องขอไปยังหน้า HTML ธรรมดา ๆ บนเซิร์ฟเวอร์ของเราหรือไปยังเว็บเซิร์ฟเวอร์อื่น ๆ มันทำให้ roundtrips เพิ่มเติมไปยังเซิร์ฟเวอร์ในแต่ละคำขอ มันไม่รักษาสตริงแบบสอบถามและตัวแปรแบบฟอร์มจากคำขอเดิม ช่วยให้สามารถดู URL ที่เปลี่ยนเส้นทางใหม่ซึ่งมีการเปลี่ยนเส้นทางในเบราว์เซอร์ (และสามารถคั่นหน้าได้ถ้าจำเป็น) คำตอบ การเปลี่ยนเส้นทางเพียงส่งข้อความลงไปที่เบราว์เซอร์ (HTTP 302)
Server.Transfer Server.Transfer () ไม่เปลี่ยนแถบที่อยู่เราไม่สามารถกด back ได้หนึ่งควรใช้ Server.Transfer () เมื่อเขา / เธอไม่ต้องการให้ผู้ใช้เห็นว่าเขากำลังจะไปไหน บางครั้งในหน้าประเภท "กำลังโหลด" มันถ่ายโอนคำขอหน้าปัจจุบันไปยังหน้า. aspx อื่นบนเซิร์ฟเวอร์เดียวกัน มันรักษาทรัพยากรของเซิร์ฟเวอร์และหลีกเลี่ยงการปัดเศษที่ไม่จำเป็นไปยังเซิร์ฟเวอร์ มันรักษาสตริงแบบสอบถามและตัวแปรแบบฟอร์ม (เป็นทางเลือก) มันจะไม่แสดง URL จริงที่มันเปลี่ยนเส้นทางการร้องขอในเว็บเบราว์เซอร์ของผู้ใช้ เซิร์ฟเวอร์การถ่ายโอนเกิดขึ้นโดยที่เบราว์เซอร์ไม่ทราบอะไรเลยเบราว์เซอร์ร้องขอหน้าเว็บ แต่เซิร์ฟเวอร์ส่งคืนเนื้อหาของอีกรายการหนึ่ง