พรีคอมไพล์ใหม่ในระหว่างการเผยแพร่มีผลอย่างไรกับแอปพลิเคชัน MVC4


86

ดังนั้นฉันเพิ่งอัปเดต Visual Studio 2012 เป็นอัปเดต 2 และดูเถิดในครั้งต่อไปที่ฉันจะเผยแพร่แอปพลิเคชันของฉัน (ผ่านไฟล์เผยแพร่ในกรณีนี้) ฉันสังเกตเห็นว่ามีตัวเลือกใหม่สามตัวเลือก:

  1. ลบไฟล์ที่มีอยู่ทั้งหมดก่อนที่จะเผยแพร่
  2. คอมไพล์ล่วงหน้าระหว่างการเผยแพร่ (พร้อมลิงก์สำหรับกำหนดค่า)
  3. แยกไฟล์ออกจากโฟลเดอร์ App_Data

ตัวเลือกแรกและตัวที่สามค่อนข้างอธิบายตัวเองได้ แต่ฉันไม่พบเอกสารใด ๆ เกี่ยวกับตัวเลือกที่สองเนื่องจากใช้กับ MVC เมื่อฉันตรวจสอบดูเหมือนว่าไม่มีการเปลี่ยนแปลงใด ๆ ในไฟล์ที่สร้างบนไซต์และฉันไม่เห็นการเปลี่ยนแปลงที่แท้จริงในประสิทธิภาพ


ตำแหน่งของฟังก์ชันอาจเป็นของใหม่ แต่ฟังก์ชันนั้นไม่ได้เป็นเช่นนั้น แม้ว่าจะไม่เกี่ยวกับการรวบรวม MVC แต่ WebForms ก็สามารถทำงานร่วมกันได้ในโครงการ MVC
Grant Thomas

คำตอบ:


85

การใช้พรีคอมไพเลอร์ ASP.NET อาจส่งผลกระทบต่อไปนี้กับแอป MVC ของคุณ:

  • หากคุณมีสิ่งใด ๆ ใน App_Code สิ่งนั้นจะถูกคอมไพล์ไว้ใน DLL ก่อนการปรับใช้ หากไม่มีการคอมไพล์ล่วงหน้าสิ่งนี้จะเกิดขึ้นทันทีโดยรันไทม์ ASP.NET
  • หากคุณเลือกตัวเลือกที่จะไม่ทำให้หน้าของคุณอัปเดตได้ (เช่นยกเลิกการเลือกช่องทำเครื่องหมายแรกในกล่องโต้ตอบการตั้งค่าขั้นสูง) ระบบจะคอมไพล์มุมมองของคุณล่วงหน้า (ASPX และ Razor) แทนการรวบรวมข้อมูลเหล่านั้นแบบไดนามิกที่รันไทม์เช่นกัน การตั้งค่าเริ่มต้น (ตรวจสอบ) ของ "อนุญาตให้อัปเดตไซต์ที่คอมไพล์ล่วงหน้าได้" ช่วยให้คุณสามารถอัปเดตเนื้อหามุมมองของคุณได้โดยไม่จำเป็นต้องสร้างโครงการใหม่ทั้งหมด

หากคุณไม่มีไฟล์ใด ๆ ใน App_Code และคุณต้องการให้ไซต์ของคุณยังคงสามารถอัปเดตได้ดูเหมือนว่าจะไม่ต้องทำอะไรมาก


7
@Elsimer ไฟล์. cshtml ของคุณจะยังคงมีอยู่ แต่หากมีการคอมไพล์เนื้อหาไว้ล่วงหน้าคุณจะพบว่าเนื้อหาของไฟล์เหล่านั้นถูกแทนที่ด้วย "นี่คือไฟล์มาร์กเกอร์ที่สร้างโดยเครื่องมือการคอมไพล์ล่วงหน้าและไม่ควรลบออก!"
Jimmy

4
นอกจากนี้การเพิ่มประสิทธิภาพส่วนใหญ่จะเกิดจากการเปิดไซต์ครั้งแรกเมื่อคอมไพเลอร์ถูกเรียกแบบไดนามิกสำหรับแต่ละเพจ เมื่อเพจถูกตีหนึ่งครั้ง (และคอมไพล์) ผลลัพธ์การคอมไพล์นั้นจะถูกใช้ในการโหลดเพจครั้งต่อ ๆ ไปแม้ว่าคุณจะไม่ได้คอมไพล์ล่วงหน้าก็ตาม
Jimmy

16
ประโยชน์เพิ่มเติมของการไม่อัปเดตหน้าเว็บของคุณคือ VS จะพบข้อผิดพลาดประเภทในมุมมองของคุณก่อนที่จะนำไปยังไซต์จริงของคุณ
คริส

4
@ คริสคุณควรพิจารณากลยุทธ์การทดสอบของคุณใหม่หากข้อผิดพลาดดังกล่าวจะไม่ถูกตรวจพบโดยไม่มีตัวเลือกพรีคอมไพล์
user247702

2
@ AndersLindén: เพียงทดสอบการตอบสนองที่แสดงผลจริงของการกระทำของคอนโทรลเลอร์ของคุณ สิ่งนี้จะเรียก Razor และหากสร้างข้อยกเว้นนั่นจะทำให้การทดสอบของคุณล้มเหลว อย่างไรก็ตามนี่คือเหตุผลที่มุมมองของคุณควรมีความสำคัญกับโค้ด คุณไม่สามารถทำการทดสอบหน่วยแบบละเอียดเกี่ยวกับโค้ดมุมมองอย่างที่ทำได้ในชั้นเรียน มันค่อนข้างจะผ่านหรือล้มเหลวและถึงอย่างนั้นการผ่านก็หมายความว่ามันไม่ได้สร้างข้อยกเว้นใด ๆ ไม่ใช่ว่ามันทำได้จริงอย่างที่ควรจะเป็น
Chris Pratt

0

เป็นคำถามเก่า แต่ฉันเพิ่งพบปัญหาที่คล้ายกันและรู้สึกว่ามีอะไรที่ควรค่าแก่การแบ่งปัน

ข้อความแสดงข้อผิดพลาดของฉันเหมือนกันในโพสต์นี้ โครงการของฉันคือ MVC5 สร้างด้วย Visual Studio 2013 professional ข้อผิดพลาดในการคอมไพล์: ประเภท 'ASP.global_asax' มีอยู่ใน DLL ทั้งสอง

ในกรณีของฉันด้วยตัวเลือก precompile มีไฟล์ App_global.asax.dll ในโฟลเดอร์ bin และทำให้เกิดข้อความแสดงข้อผิดพลาดข้างต้น ก่อนอื่นฉันลบ App_global.asax.dll บนเซิร์ฟเวอร์รีสตาร์ทแอปพลิเคชันพูลปัญหาก็หายไป จากนั้นฉันลองใช้วิธีอื่นยกเลิกการเลือกคอมไพล์ล่วงหน้าและเผยแพร่ใหม่ปรับใช้กับเซิร์ฟเวอร์อีกครั้งปัญหาก็หายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.