ฉันค่อนข้างใจร้ายในช่วงสุดสัปดาห์และตัดสินใจอัปเกรดโปรเจ็กต์เป็นแพลตฟอร์ม 2.0 เนื่องจาก VS2003 และ 2005 สามารถอยู่ร่วมกันได้ ปัญหาจึงค่อนข้างง่ายที่จะจัดการ ติดตั้งเวอร์ชัน Pro ของปี 2005 เปิดโปรเจ็กต์ดั้งเดิมและอัปเกรด ตัวช่วยสร้างจะปรากฏขึ้นโดยอัตโนมัติ โปรเจ็กต์ประกอบด้วยโปรเจ็กต์ย่อย 7 โปรเจ็กต์ ตรรกะและการแสดงผลทั้งหมดถูกนำมาใช้ในโปรเจ็กต์เบื้องหลัง แต่ละไฟล์ในโปรเจ็กต์เว็บส่วนหน้าจะใช้เฉพาะการเรียกไปยังเมธอดเบื้องหลังเท่านั้น การอัพเกรดราบรื่นมาก
โดยสรุป ไฟล์โครงการในโครงการเว็บได้ถูกลบไปแล้ว ปรากฎว่าไฟล์ ASPX สองไฟล์ที่ไม่เกี่ยวข้องก็ถูกนำมาพิจารณาในกระบวนการคอมไพล์ด้วย ฉันคอมไพล์ อัปโหลดไปยังเซิร์ฟเวอร์ และรายงานข้อผิดพลาด ต่อมาฉันพบว่าโปรเจ็กต์ที่คอมไพล์ใหม่ไม่มี Dll ของโปรเจ็กต์เว็บ แต่ยังคงอยู่ในไดเร็กทอรีเซิร์ฟเวอร์ ผลลัพธ์ที่ได้คือการอ้างอิงภายในที่ยุ่งเหยิง ลบ Dll ของโครงการเว็บเก่าและไม่เป็นไร
จากนั้นฉันวางแผนที่จะลองใช้โหมดการเผยแพร่ ฉันใช้ฟังก์ชันการเผยแพร่ในรายการเมนูสร้างของ VS2005 เพื่อตั้งค่าไดเรกทอรีที่จะเผยแพร่ กระบวนการรวบรวมมีความซับซ้อนมาก หลังจากการคอมไพล์เสร็จสิ้น มีหลายสิ่งถูกสร้างขึ้นในไดเร็กทอรี bin ฉันคิดว่าการคัดลอกสิ่งเหล่านี้ไปยังเซิร์ฟเวอร์จะช่วยลดความจำเป็นในการคอมไพล์ใหม่ทั้งหมด ปรากฎว่ากระบวนการ csc ยังคงปรากฏขึ้นเมื่อมีการเข้าถึงเพจเป็นครั้งแรก หลังจากเปลี่ยนเว็บไซต์ทั้งหมดแล้ว ก็ยังมีกระบวนการ CSC อยู่มากมาย แต่กระบวนการคอมไพล์เร็วขึ้นกว่าเดิมเล็กน้อย
ปัญหาร้ายแรงอีกประการหนึ่งเกิดขึ้น ดูเหมือนว่าโปรแกรมจะรีสตาร์ทโดยอัตโนมัติหลังจากนั้นไม่นาน ทำให้เกิดการคอมไพล์อีกครั้ง ต่อมาหน้าต่างข้อผิดพลาดปรากฏขึ้นบนเซิร์ฟเวอร์ โดยบอกว่ามีข้อผิดพลาดในกระบวนการ w3wp.exe มัน? หลังจากเลือกยกเลิก w3wp.exe จะรีสตาร์ทโดยอัตโนมัติ และเริ่มต้นการคอมไพล์ใหม่รอบใหม่ กระบวนการนี้เกิดขึ้นสามครั้ง และฉันกลัวมากจึงเปลี่ยนกลับเป็นเวอร์ชัน 1.1 อย่างรวดเร็ว ฉันได้ดูในตัวแสดงเหตุการณ์และพบข้อยกเว้นที่ไม่สามารถจัดการได้จำนวนมาก ซึ่งโดยพื้นฐานแล้วเป็นข้อผิดพลาดที่มีค่าว่าง น่าแปลกที่ไม่มีปัญหาใน 1.1 และไม่มีการเปลี่ยนแปลงรหัส
ต่อมาฉันพบบทความ (ดูเหมือนจะไม่มีใครพูดถึงในภาษาจีน) http://www.eggheadcafe.com/articles/20060305.asp การจัดการข้อยกเว้นที่ไม่สามารถจัดการได้ใน 2.0 นั้นแตกต่างจากใน 1.1 มาก แตกต่างออกไป 1.1 จะเพิกเฉยต่อมันเว้นแต่จะส่งผลต่อการสร้างเพจ และ 2.0 จะทำให้กระบวนการรายงานข้อผิดพลาดส่งผลโดยตรงต่อการทำงานของเว็บไซต์ทั้งหมด ดูเหมือนเป็นปัญหาร้ายแรง แต่ดูสมเหตุสมผลกว่า ไม่เช่นนั้นโปรแกรมเมอร์จะเพิกเฉยต่อข้อผิดพลาดนี้ต่อไป อย่างไรก็ตาม เนื่องจากปัญหานี้ การไม่สามารถเปลี่ยนเว็บไซต์ได้จึงเป็นปัญหาร้ายแรงเช่นกัน ดังนั้นจึงจำเป็นต้องมีวิธีการเปลี่ยนแปลงที่ราบรื่น ตามที่กล่าวไว้ข้างต้น วิธีนี้คือการเขียน HttpModule ด้วยตัวเองเพื่อจัดการกับข้อยกเว้นที่ไม่สามารถจัดการได้ทั้งหมด และบันทึกข้อมูลข้อยกเว้นลงในเหตุการณ์ของระบบ ซึ่งเป็นประโยชน์ต่อโปรแกรมเมอร์ในการประมวลผล และการดาวน์โหลดไฟล์ซอร์สโค้ดและไฟล์ไบนารี่ของ HttpModule นี้ก็มีให้ไว้ด้านบนเช่นกัน รวมถึง Demo WebApp
ในที่สุดฉันก็เข้าใจวิธีการคอมไพล์ของเวอร์ชัน 2.0 ก่อนการปรับใช้แล้ว การใช้ VS เพื่อเผยแพร่เว็บไซต์ถือเป็นเรื่องผิด คุณต้องใช้ aspnet_compiler.exe เพื่อคอมไพล์ด้วยตนเอง และกระบวนการคอมไพล์จะขึ้นอยู่กับการตั้งค่าจริงของเว็บไซต์ กล่าวอีกนัยหนึ่ง คุณต้องอัปโหลดเนื้อหาของโครงการเว็บไปยังเว็บไซต์ กำหนดเส้นทางของเว็บไซต์ใน IIS จากนั้นใช้ aspnet_compile เพื่อคอมไพล์ คุณสามารถคอมไพล์ภายในเครื่องได้ รายการในไดเรกทอรีแคชใน WindowsMicrosoft.Net จะเหมือนกับรายการที่สร้างโดย csc.exe เมื่อผู้ใช้เข้าถึงเพจจริงๆ หลังจากขั้นตอนนี้ จะไม่มีการดำเนินการคอมไพล์เกิดขึ้นเมื่อผู้ใช้เข้าชมสองครั้ง
เหนื่อยจังเลย อย่างไรก็ตาม ฉันคิดถึงวิธีการสลับที่ราบรื่น โดยให้เว็บไซต์สองแห่งชี้ไปยังไดเร็กทอรีที่แตกต่างกันสองไดเร็กทอรี โดยอันหนึ่งไม่มีส่วนหัวของโฮสต์ และอีกอันมีส่วนหัวของโฮสต์สำหรับการอัปเดต หลังจากอัปเดตเว็บไซต์ด้วยส่วนหัวของโฮสต์แล้ว ให้ใช้ aspnet_compiler เพื่อคอมไพล์ จากนั้นสลับส่วนหัวของโฮสต์ของทั้งสองเว็บไซต์ เพื่อให้ผู้ใช้ที่เพิ่งเยี่ยมชมจะถูกนำทางไปยังเว็บไซต์ที่คอมไพล์ใหม่ และผู้ใช้จะไม่รู้สึกล่าช้า เพียงอัปเดตไซต์อื่นในครั้งต่อไป
http://www.cnblogs.com/unfish/archive/2006/09/10/500230.html