เปลี่ยนเส้นทางผู้ใช้ด้วย POST แทนที่จะใช้ GET ใน ASP.NET

เมื่อทำงานกับฟอร์มใน ASP.NET นักพัฒนามักต้องเผชิญกับความท้าทาย: วิธีการเปลี่ยนเส้นทางผู้หลังจากการส่งฟอร์มในขณะที่ส่งข้อมูลโดยใช้คำขอแบบ POST แทนที่จะเป็น GET ปัญหานี้เกิดขึ้นโดยเฉพาะเมื่อคุณต้องการบันทึกข้อมูลบางอย่างและจากนั้นให้ผู้ใช้ถูกเปลี่ยนเส้นทางไปยังหน้าอื่นภายนอกขณะมั่นใจว่าข้อมูลฟอร์มเดิมถูกส่งไปกับคำขอ มาตรวจสอบวิธีการแก้ไขที่เป็นไปได้สำหรับปัญหานี้กันเถอะ

การเข้าใจ HTTP Redirects

เพื่อทำความเข้าใจปัญหาการเปลี่ยนเส้นทางนี้ เราจำเป็นต้องพิจารณาว่า HTTP redirects ทำงานอย่างไร โดยทั่วไปแล้ว เมื่อคุณเรียกใช้ Response.Redirect() ใน ASP.NET เซิร์ฟเวอร์จะส่งคำตอบกลับมาพร้อมกับ HTTP Status Code 302 ซึ่งสั่งให้เบราว์เซอร์ไปยัง URL ใหม่ อย่างไรก็ตามจุดสำคัญที่นี่คือสิ่งนี้จะสร้างคำขอใหม่โดยอัตโนมัติผ่าน GET ไม่ใช่ POST นี่หมายความว่าข้อมูลที่คุณต้องการส่งจะไม่ถูกรวมอยู่ในการเปลี่ยนเส้นทาง

การใช้ HTTP Status Code 307

หนึ่งในทางเลือกคือการใช้ HTTP Status Code 307 โดยที่แตกต่างจาก 302 ซึ่งเปลี่ยนคำขอเดิมให้เป็น GET รหัสสถานะ 307 จะแจ้งให้เบราว์เซอร์รักษาโหมดการขอไว้ การใช้งานจะแสดงดังนี้:

public void PageLoad(object sender, EventArgs e)
{
    // ประมวลผลโพสต์จากด้านของคุณ
    
    Response.Status = "307 Temporary Redirect";
    Response.AddHeader("Location", "http://example.com/page/to/post.to");
}

หมายเหตุสำคัญเกี่ยวกับพฤติกรรมของเบราว์เซอร์

สิ่งสำคัญคือต้องทราบว่าไม่ว่าเบราว์เซอร์ทั้งหมดจะจัดการกับการเปลี่ยนเส้นทาง 307 อย่างสม่ำเสมอ ตัวอย่างเช่น:

  • Internet Explorer (IE) มักจะเปลี่ยนเส้นทางคำขอ POST โดยไม่มีการแจ้งเตือนหรือการยืนยันใดๆ
  • Safari อาจละทิ้งข้อมูล POST ดังนั้นจึงเปลี่ยน 307 ให้เป็นวิธีการที่คล้ายกับ 302 ซึ่งจะทำให้ข้อมูลสูญหาย

เนื่องจากความไม่สอดคล้องเหล่านี้ การพึ่งพารหัสสถานะ 307 เพียงอย่างเดียวนั้นมีความเสี่ยง

วิธีแก้ไขที่ใช้ JavaScript

เนื่องจากรหัสสถานะ HTTP อาจนำไปสู่อาการที่คาดเดาไม่ได้ในเบราว์เซอร์ที่แตกต่างกัน วิธีที่เชื่อถือได้ที่สุดคือการใช้ JavaScript ต่อไปนี้คือสองวิธีที่คุณสามารถนำไปใช้:

ตัวเลือก 1: สร้างและส่งฟอร์มผ่าน AJAX

  1. สร้างฟอร์มที่มี action ชี้ไปยังเซิร์ฟเวอร์ของบุคคลที่สาม
  2. แนบตัวจัดการเหตุการณ์คลิกเข้ากับปุ่มส่งที่:
    • ส่งคำขอ AJAX ไปยังเซิร์ฟเวอร์ของคุณพร้อมข้อมูลที่จำเป็น
    • ช่วยให้ฟอร์มถูกส่งไปยังเซิร์ฟเวอร์ของบุคคลที่สามได้

วิธีการนี้ต้องการ JavaScript ซึ่งอาจก่อให้เกิดปัญหาหากผู้ใช้ปิดการใช้งานไว้

ตัวเลือก 2: เปลี่ยนเส้นทางด้วยฟอร์มที่ซ่อนอยู่

  1. ออกแบบฟอร์มของคุณเพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ของคุณ
  2. หลังจากส่งฟอร์ม แสดงหน้าเว็บที่มีฟอร์มอีกอันหนึ่งซึ่งมีข้อมูลที่จำเป็นทั้งหมดเข้ารหัสเป็นข้อมูลซ่อน พร้อมกับข้อความที่เขียนว่า “กำลังเปลี่ยนเส้นทาง…”
  3. ใช้ JavaScript เพื่อส่งฟอร์มนี้อัตโนมัติไปยังเซิร์ฟเวอร์ของบุคคลที่สาม

ทำไมถึงเลือกวิธีนี้?

  • ความเชื่อถือได้: ไม่จำเป็นต้องพึ่งพาว่า JavaScript ได้เปิดใช้งานอยู่หรือไม่ เนื่องจากคุณสามารถแสดงปุ่มส่งให้กับผู้ใช้ได้หากจำเป็น
  • การควบคุมข้อมูล: คุณเลือกว่าข้อมูลใดถูกส่งไปยังเซิร์ฟเวอร์ภายนอก จึงป้องกันการเปิดเผยข้อมูลที่ไม่ตั้งใจ

บทสรุป

การเปลี่ยนเส้นทางคำขอ POST ใน ASP.NET นั้นยุ่งยากจริงๆ เนื่องจากข้อจำกัดด้านการจัดการของเบราว์เซอร์และพฤติกรรม HTTP มาตรฐาน อย่างไรก็ตาม การใช้ JavaScript เพื่อสร้างฟอร์มที่ซ่อนอยู่หรือใช้ AJAX ให้ทางออกที่ใช้งานได้จริงเพื่อให้แน่ใจว่าข้อมูลของคุณถูกส่งอย่างถูกต้องในระหว่างการเปลี่ยนเส้นทาง วิธีเหล่านี้ไม่เพียงแต่ช่วยเพิ่มความน่าเชื่อถือ แต่ยังมอบการควบคุมที่มากขึ้นต่อข้อมูลที่ส่งไปยังเซิร์ฟเวอร์ภายนอก

หากคุณพบความท้าทายในการใช้งานเทคนิคเหล่านี้ สามารถติดต่อเพื่อขอความช่วยเหลือในการพัฒนา ASP.NET ของคุณได้เลย!