เรตติ้ง
เขียนโดย
Wiennat - asp.net, Silverlight, .NET, ASP.NET Ajax, asp.net futures, ASP.NET MVC
เมื่อวันที่
18 January 2009 ตอน 11:21
นี่เป็นคำถามที่อยู่ในหัวผมหลังจากที่อ่านเอกสารใน MSDNแบบผ่านๆในหัวข้อ ASP.NET Routing versus URL Rewriting พอ M3rlinez มาถามก็เลยลองไปหาอ่านละเอียดๆอีกที พบว่าการทำ Routing (ในบริบทของ ASP.NET) มันต่างกับ URL Rewriting อยู่นิดหน่อย
ข้อแรกที่แตกต่างคือ การทำ Routing รองรับการสร้าง URL โดยใส่พารามิเตอร์ที่ต้องการ ซึ่งตรงนี้ใน URL Rewriting ไม่มีกลไกตรงนี้ให้ต้องทำเอง (มันไม่ต่างกันไม่ใช่เรอะ แค่ไมโครซอฟท์ทำไว้ให้แล้ว) ตรงนี้จะว่าเป็นข้อดีก็ได้
ข้อแตกต่างข้อที่สองคือ Routing ทำงานในอีเวนท์ PostResolveCache และ PostMapRequestHandler ซึ่งจุดนี้แหละที่ต่างจากการทำ URL Rewrite จริงๆ

ปกติแล้วการทำ URL Rewrite จะใช้ HttpHandler หรือใช้ HttpModule มาดักตอนอีเวนท์ BeginRequest ซึ่งเป็นอีเวนท์แรกสุด ซึ่งตรงนี้ URL ที่เกิดรีเควส จะถูกแปลงให้อยู่ในรูปของ URL ที่ ASP.NET Webform ธรรมดาๆ เช่น “/products/15” ก็จะถูกเขียนใหม่เป็น “product.aspx?id=15” แล้วค่อยส่งไปให้ไฟล์ดังกล่าว ดังนั้นอีเวนท์ที่เกิดขึ้นด้านหลังอย่าง AuthenticateRequest จะเกิดหลังจากที่ทำการแปลง URL ไปแล้ว ทำให้การตรวจสอบสิทธิต่างๆทำกับไฟล์ปลายทาง (ซึ่งเป็น Physical file) แทนที่จะเป็นไฟล์ที่เห็นจริงๆ
แต่สำหรับ URL Routing แล้วเราสามารถใช้งานระบบ Authentication/Authorization ของ ASP.NET กับ logical file ผ่าน web.config ได้ทันที สิ่งนี้ผมยังไม่ได้ทดลอง แต่สรุปเอาเองหลังจากการดูสายการทำงานของอีเวนท์นะครับ
<location path="products">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
ผลพวงจากการที่ URL ไม่ได้ถูกเปลี่ยนในระหว่างการทำงานทำให้พารามิเตอร์ action ของอีลิเมนท์ form จะถูกตั้งให้เป็น URL ของเดิมจริงๆ ทำให้เราไม่ต้องใช้ Actionless Form เข้ามาใช้
URL Rewriting ที่ผมเคยคิดว่ามันจะกลายเป็นส่วนหนึ่งของ IIS7 นั้นถูกเปลี่ยนให้เป็น Routing แล้วผนวกเข้ามาใน ASP.NET นั้น จุดสำคัญน่าจะมาจากการที่ทีม ASP.NET นั้นได้เริ่มการพัฒนา ASP.NET MVC แล้วก็เลยจำเป็นต้องพัฒนาส่วน Routing ด้วย แล้วไหนๆก็ไหนๆแล้วก็เลยจับมันแยกออกมาเป็นคอมโพเนนท์เลยดีกว่า เพราะว่า ASP.NET Developer เดิมก็มีจำนวนไม่น้อยที่ต้องทำ URL Rewriting ด้วยตัวเอง
สรุปแล้ว URL Routing ไม่ได้มีอะไรพิเศษพิสดารต่างจาก URL Rewriting ซักเท่าไหร่ แนวคิดเดียวกันเป๊ะ แค่นำส่วนที่เราต้องทำแน่ๆอย่างการใช้ Regular Expression ในการสกัด URL และพารามิเตอร์เพื่อส่งให้ Action/WebForm ที่ถูก และการสร้าง URL รวมเข้ามาอยู่ในตัวเฟรมเวิร์กเลย และจุดประสงค์จริงๆก็คงจะเอามาใช้กับ ASP.NET MVC นั่นแหละ
Read the complete post at http://onedd.net/2009/01/18/468-url-routing-and-rewriting