Skip to main content

ปัญหาในการย้ายจาก ASP.NET Web Site เป็น ASP.NET Web Application Project

Submitted by ezybzy on

พอดีระบบงานที่ทำอยู่ในการนำโค้ดของโปรเจ็ค MyWSAT ซึ่งเป็น ASP.NET Web Site ที่ทำหน้าสำหรับจัดการกับ ASP.NET Membership ซึ่งในระบบนี้จุดเด่นที่สำคัญของมันคือ การทำ CustomProfile ที่อยู่ในรูปแบบของตารางข้อมูลที่สามารถ Query ได้สะดวกกว่า Profile แบบที่ ASP.NET Membership ทำให้โดยค่าปริยายซึ่งจะจัดเก็บทุก Field ใน Profile ของผู้ใช้ในรูปแบบของ XML ยัดลงในหนึ่งคอลัมน์ของตารางจัดเก็บค่า Profile

ทีนี้ ต้องเอา MyWSAT ซึ่งเป็น ASP.NET Web Sites ไปรวมกับโค้ดของอีกโปรเจคที่ชื่อ DotNetOpenAuth ซึ่งเป็นตัวจัดการการเชื่อมต่อกับ OpenID (เป็นได้ทั้ง Provider และ Relying Party) แต่ตัวอย่างโค้ดที่ให้มา ดันเป็น ASP.NET Web Application หมด ทีนี้ก็จะเริ่มเกิดปัญหาความเข้ากันได้แล้วเนื่องจาก ASP.NET Web Site และ ASP.NET Web Application Project นั้นมีความแตกต่างกันอยู่พอสมควร แม้ว่าจะเห็นผลลัพธ์ออกมาเหมือน ๆ กัน

สำหรับข้อแตกต่างของมัน สามารถหาอ่านได้ไม่ยาก โดยส่วนตัวผมถือหาง ASP.NET Web Application Project มากกว่า เพราะสามารถสร้าง Package สำหรับ Deploy ได้ง่าย และการติดตั้งบนเครื่องที่ใช้รันงานทำได้ง่าย (เรียกตัวติดตั้งแล้วใช้ได้เลย) ซึ่งแตกต่างจาก ASP.NET Web Site ที่จำเป็นต้องยกตัว Precompiled ข้ามไปติดตั้งเอง ซึ่งดูไม่ค่อยเป็นมิตรเท่าไร (เว้นแต่จะลงทุนสร้างตัวติดตั้งเพิ่มเติมเอาเอง ซึ่งก็ทำให้ดูมีขั้นตอนที่เพิ่มขึ้นมาอีก)

ผมเลยทดลอง ลองย้าย MyWSAT จาก Web Site มาเป็น Web Application Project ซึ่งทำตามขั้นตอนของ Microsoft ก็พบปัญหาว่ามี Master Page หนึ่งไฟล์ที่มีชื่อซ้ำกันเมื่อทำขั้นตอน Convert to Web Application ซึ่งต้องเปลี่ยนไฟล์ใดไฟล์หนึ่งแล้วปัญหานี้จะจบไป แต่สุดท้ายก็มาติดปัญหาที่เป็นกำแพงสำคัญ นั่นคือ Web Application Project นั้นไม่ได้ให้คลาส ProfileCommon มาด้วย ทำให้จุดเด่นในการทำ Strong-typed เพื่อแก้ไข Profile ของผู้ใช้หายไป อันเนื่องมาจากพฤติกรรมการทำงานของ Web Application Project ที่ไม่สามารถสร้างคลาส ProfileCommon ขึ้นมาให้ได้เองจากการอ่านค่าที่กำหนดใน <profile /> ภายใน web.config เราจำเป็นต้องเขียน ProfileCommon ขึ้นเองโดยอาจจะแอบอิงกับโครงสร้างในการเชื่อมต่อกับ ASP.NET Membership แต่ก็ยังดูวุ่นวายอยู่ดี

สรุป ก็คงต้องย้าย DotNetOpenAuth จาก Web Application Project มาเป็น Web Site แทน ซึ่งความเป็นไปได้ก็มี แต่เราไม่สามารถเพียงแค่คัดลอกโค้ดเดิมมาใช้ได้ทันที อาจจะต้องเขียนขึ้นมาใหม่และดัดแปลงสภาพตามสมควร