Friday, August 16, 2013

การทำ precompilation ใน asp.net 2.0 v2

ASP.NET 2.0 โมเดลใหม่ที่เปลี่ยนไป
ผมไม่ได้ใช้ ASP.NET เป็นหลัก จึงต้องขออภัยที่ตอบช้ามากๆ
เพิ่งจะถูกกระตุ้นด้วยคำถามทำนองนี้เข้ามาอีก 
จนกระทั่งรู้สึกว่าต้องไปหาคำตอบมาให้ แต่บางที 
ตอนนี้คุณชายสี่หมี่เกี๊ยวอาจจะหาคำตอบได้เองแล้ว

1. พฤติกรรมปกติของ ASP.NET 2.0 เป็นอย่างไร?
ปกติแล้ว ASP.NET 2.0 จะ compile เว็บเป็น .Dll ทำนองเดียวกับ
ที่เคยทำใน ASP.NET 1.x โดยจะไปวางไว้ในโฟลเดอร์นี้
<Windows directory>\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files


ไฟล์ .Dll นี้จะถูกสร้างอัตโนมัติเมื่อมีการเข้าถึงไฟล์ .aspx, .asmx, .ascx ครั้งแรก
ดังนั้น การใช้เว็บ "ครั้งแรก" จะช้ากว่าปกติสักหน่อย แต่หลังจากนั้น 
เร็วฉลุย เพราะใช้โค้ดที่ compile ไว้แล้วแทน
(จนกว่า ไฟล์ ต้นฉบับ หรือ code-behind มีการเปลี่ยนแปลง)

หมายเหตุสำหรับคนใช้ Express Edition
* ผู้ใช้ Visual Web Developer (VWD) จะมีสิทธิ์ได้เฉพาะโมเดลแบบนี้
(คอมไพล์ .Dll ในการเรียกครั้งแรก ใส่ให้ใน Temporary Folder เท่านั้น
ทำ precompile ไม่ได้ - แต่ความจริงก็ทำได้แหล่ะครับ
ถ้าใช้ command-line utility "aspnet_compiler" เอาเอง)


ผมเรียกว่า "ลูกกั๊ก" ของไมโครซอฟต์ก็แล้วกัน อย่างที่ทราบแล้วไงครับ
ว่า VWD ใช้สำหรับ students และ hobbiest เท่านั้น ก็ฟรีนี่ครับ
ใช้ในแบบของ commercial software ไม่ได้ครับ 

2. ถ้าต้องการ Deploy เว็บไซต์ upload เฉพาะไฟล์ .Dll
ไม่เอา source code ขึ้นไปด้วย ได้มั้ย?

ตอบว่า ทำได้ครับ และทำได้ดีกว่าเดิมอีกด้วยสิครับ

ASP.NET 1.x
ใน ASP.NET 1.x เว็บเพจหนึ่งหน้า จะประกอบด้วย
ไฟล์ .aspx และ .aspx.vb (หรือ .aspx.cs) ซึ่งเป็น code-behind
ซึ่งจะสามารถเอา .vb หรือ .cs นี้ คอมไพล์ก่อนให้เป็น .Dll
แล้วเอาขึ้นเว็บโฮสต์ได้ กลไกโดยละเอียด เป็นดังนี้ครับ

ขอไม่อธิบายรายละเอียดของภาพล่ะ เดี๋ยวจะยาวเกินไป.
สรุปเลยครับว่า ASP.NET 1.x สามารถ compile ไฟล์ .vb, .cs ให้เป็น .Dll
แล้วเอาขึ้นเฉพาะไฟล์ .Dll ได้ (source code ไม่ต้อง) แต่ไฟล์ .aspx ที่คู่กัน
ต้องเอาขึ้นไปด้วย ดังนั้นแบบที่ปลอดภัยที่สุดที่จะทำได้คือ

สรุปได้ว่า
deploying ASP.NET 1.x => ได้ไฟล์ .aspx + .dll



ASP.NET 2.0
asp.net เวอร์ชั่นนี้ แปลกไป ทำให้ผู้ที่เคยใช้ asp.net 1.x มาก่อน งงไปกันหมด
ว่า .Dll มันหายไปไหน ผมจะสรุปให้ครับ สุดท้ายแล้ว ก็ไม่วุ่นวายซับซ้อนอะไร
ก่อนอื่นขอบอกก่อนว่า มี command-line utility ชื่อว่า "aspnet_compiler" 
ที่ทำหน้าที่อยู่เบื้องหลัง แต่ผมขออธิบายวิธีการใช้แบบผ่าน Visual Studio ที่ง่ายกว่า
และครอบคลุมงานหลักๆ ที่ต้องการแล้วครับ

1. รู้จักเมนูใหม่ Build --> Publish
Visual Studio จะไม่สร้าง .Dll ให้ถ้าไม่ขอให้ทำ 
เราสั่งได้ที่เมนู Publish ครับ 

เมนูนี้ จะทำการ Pre-compile เว็บโปรเจ็กต์ให้ 
(หมายถึงทำการ compile ไว้ก่อนเลย ไม่ใช่รอให้มี
การเรียกใช้เว็บครั้งแรก แล้วค่อย compile อัตโนมัติ)
โดยผลของการ Compile จะถูกกำหนดใน Target Location
ในหน้าจอ Publish Web Site นี้ครับ


ในตัวอย่างผมก็ใส่พาธ C:\MyWeb ให้ดูเป็นตัวอย่าง
เมื่อคลิกปุ่ม OK ผลลัพธ์ของการ compile จะไปสร้างทั้ง Web Project เลยครับ
รวมถึงโฟลเดอร์ Bin ที่คิดถึงด้วย :-) ดูภาพตัวอย่างครับ

และในโฟลเดอร์ Bin

ไฟล์ .Dll อยู่นี่เองครับ

เราสามารถนำผลลัพธ์จาก Target Location นี้ทั้งโฟลเดอร์
upload ขึ้น web hosting เพื่อ deploy ได้เลย. ไม่ต้องมี source code.


2. ตั้งค่า Publish Web Site 
เมื่อให้เห็นภาพรวมแล้ว ผมขอย้อนกลับมาให้พวกเราดูของใหม่
น่าสนใจใน ASP.NET 2.0 นี้ ให้เข้าใจ แบบใช้ไม่ยากเลย 
จากข้อที่แล้ว เมนู Build -> Publish จะพบหน้าจอนี้

ยังมี ตัวเลือกที่อยากให้สนใจอยู่ 2 ตัว คือ

[x] Allow this precompiled site to be updatable
เลือกตัวเลือกนี้
 --> จะทำให้การ precompile คอมไพล์เฉพาะ code-behind (.vb, .cs) เท่านั้น
และไม่คอมไพล์ส่วน .aspx ซึ่งจะได้ผลลัพธ์คล้ายโมเดลของ ASP.NET 1.x
วิธีการนี้ เรายังสามารถแก้ไขส่วน .aspx เช่น layout ต่างๆ ของเว็บเพจ ได้โดยไม่ต้อง compile โปรเจ็กต์ใหม่

ไม่เลือกตัวเลือกนี้ --> จะทำให้การ precompile คอมไพล์ทั้งไฟล์ code-behind (.vb, .cs)
และส่วนไฟล์ .aspx ไปด้วยกัน ลงในไฟล์ .Dll เดียวกันนั่นเลย ซึ่งจะทำให้การแก้ไข
เว็บเพจใดๆ ต้องมีการคอมไพล์กันใหม่ทั้งโปรเจ็กต์เลย. วิธีการนี้ ไฟล์ .aspx จะถูกสร้างใน Target Location ด้วย
แต่ภายในไฟล์จะไม่มีข้อมูลของไฟล์ .aspx ต้นฉบับเลย แต่มีข้อความ marker แทน ดังนี้


[x] Use fixed naming and single page assemblies
เลือกตัวเลือกนี้ --> ทำให้ชื่อไฟล์ .Dll ที่จะได้คงที่ตลอด ไม่เปลี่ยนแปลง
ไม่เลือกตัวเลือกนี้ --> ชื่อไฟล์จะถูกสร้างใหม่เรื่อยๆ ถ้า upload ขึ้นเว็บโฮสต์ หลายๆ ทีเข้า
ก็อาจจะมีไฟล์ที่ไม่ได้ใช้จำนวนมาก.

สรุปได้ว่า
deploying ASP.NET 2.0 (แบบ updatable) => ได้ไฟล์ .aspx + .dll 

หรือเลือก
deploying ASP.NET 2.0 (แบบ not updatable) => ได้ เฉพาะไฟล์ .dll

No comments:

Post a Comment