อัปเดตเว็บไซต์. NET โดยไม่ต้องโหลดซ้ำ


13

ฉันใช้ในการพัฒนาเว็บไซต์PHPและASP classicและหากจำเป็นต้องมีการเปลี่ยนแปลง คุณสามารถแก้ไขไฟล์เดียว / หลายไฟล์และไม่มีใครสังเกตเห็นได้จริงๆ บางทีถ้ามีใครบางคนจะขอไฟล์ที่มีการเปลี่ยนแปลงในระหว่างการอัปโหลด แต่นั่นก็เหมือนครึ่งวินาทีที่สอง สำหรับไซต์ขนาดเล็กส่วนใหญ่นั้นไม่มีปัญหา

แต่เว็บไซต์ล่าสุดสร้างด้วยC# MVCและเมื่อคุณทำการเปลี่ยนแปลงรหัสคุณจะต้องสร้างเว็บไซต์ของคุณใหม่และอัปโหลดDLLไฟล์ที่มีการเปลี่ยนแปลง แต่เมื่อคุณเปลี่ยนไฟล์มันจะรีสตาร์ทเว็บไซต์ของคุณและตั้งค่าการใช้งานทั้งหมดDLL sessionsนอกจากนี้ยังต้องโหลดทุกอย่างอีกครั้งและด้วยเว็บไซต์ขนาดใหญ่อาจใช้เวลาสักครู่ในการโหลดทุกอย่าง ทุกคนที่กำลังดูเว็บไซต์จะสังเกตเห็นและจำเป็นต้องเข้าสู่ระบบอีกครั้ง

การอัปเดตเว็บไซต์หลักนั้นไม่ธรรมดาดังนั้นจึงไม่ใช่ปัญหา แต่เรามีอัปเดต "เล็ก ๆ " เป็นประจำสำหรับโปรโมชัน เช่น 'กรอกแบบฟอร์มนี้และรับการเป็นสมาชิกฟรีสามเดือน' หรือ '10 อันดับแรกในการอัปโหลดภาพ ... จะได้รับราคา' ฉันคิดว่าคุณจะได้รับการดริฟท์ โปรโมชั่นบางอย่างมีความคล้ายคลึงและสามารถจัดการกับโมดูลที่แสดงข้อมูลที่ถูกต้องตามการตั้งค่า แต่บ่อยครั้งที่มันต้องใช้รหัสที่กำหนดเอง

ฉันคิดของระบบที่แต่ละโปรโมชั่นของตัวเองมันเป็นDLLไฟล์บนอินเตอร์เฟซที่ใช้แล้วโหลดDLLแบบไดนามิกโดยใช้Type.GetType, และActivator.CreateInstance InvokeMemberถึงแม้ว่ามันจะใช้ได้ แต่ฉันก็สงสัยว่ามันเป็นวิธีที่ถูกต้องหรือไม่

ดังนั้นคำถามของฉัน: คุณจะอัปเดต.NETไซต์ได้อย่างไรโดยไม่ต้องโหลดซ้ำทั้งไซต์และเซสชันดร็อป (เช่นแอปพลิเคชันรีไซเคิล)


เพื่อตอบสนองต่อความคิดเห็นของคุณ: เว็บไซต์ขนาดใหญ่ที่ฉันทำงานเกี่ยวกับการเปลี่ยนแปลงโค้ดขนาดเล็กในลักษณะเดียวกับที่พวกเขาจัดการกับการเปลี่ยนแปลงโค้ด: ผ่าน load-balancer และนอกกระบวนการ - เพราะโค้ดทั้งหมดที่ถูกปรับใช้เพื่อตอบสนองความต้องการสด กระบวนการตรวจสอบ / ออกจากระบบและเราไม่สามารถวางรหัสบนเซิร์ฟเวอร์ได้ ฉันเดาคำจำกัดความ "ใหญ่" ของเราอาจไม่ตรงกัน;)
Zhaph - Ben Duguid

คำตอบ:


11

ดูที่ "การกำหนดค่าเริ่มต้นของแอปพลิเคชัน" IIS 7.5, Windows 2008 R2 (ยากต่อการติดตั้ง) IIS 8, Windows 2012

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

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

คุณสามารถกำหนดค่า IIS เพื่อให้การอัปเดต DLL ไม่ทำให้ไซต์รีสตาร์ททันทีหรือเปลี่ยนเป็น web.config (ค่า ChangeNotification สูงในไฟล์ httpRuntime และไฟล์กำหนดค่าภายนอกที่เกี่ยวข้องกับไซต์ของคุณ)

ผลลัพธ์สุดท้ายคือคุณสามารถอัปเดต DLL / รหัสโดยไม่ต้องรีสตาร์ทไซต์จากนั้นบังคับให้แอปเริ่มต้นใหม่ซึ่งจะใช้พื้นหลัง AppInitialization

การทำสิ่งเหล่านี้ในคอนเสิร์ตทำได้ค่อนข้างดีสำหรับการรีสตาร์ทที่ราบรื่น


ชุดของบันไดที่ดี - แน่นอนสิ่งที่ต้องพิจารณา :)
Zhaph - Ben Duguid

ดูเหมือนว่าสิ่งที่ฉันกำลังมองหา จะลองดูและตั้งค่า ขอบคุณ
Hugo Delsing

@HugoDelsing หวังว่ามันจะใช้งานได้ดีสำหรับคุณ
jeffreypriebe

ขอบคุณนี่คือสิ่งที่ฉันใช้และมันใช้งานได้ดีมาก
Hugo Delsing

@HugoDelsing ดีใจที่ได้ยินว่ามันเหมาะกับคุณเช่นกัน
jeffreypriebe

5

มีหลายวิธีในการจัดการสิ่งที่คุณขอและด้านต่าง ๆ สำหรับคำถามของคุณ:

จัดการอัปเดตเล็ก ๆ สำหรับโปรโมชั่น

สิ่งที่คุณต้องการหลังจากนี้คือระบบการจัดการเนื้อหาหรือคล้ายกันที่ช่วยให้คุณแก้ไขเนื้อหาได้ทันที (คิดว่า Wordpress / Drupal หรือจากมุมมอง. NET N2 CMS, Umbraco, Orchard, ฯลฯ ) อย่างไรก็ตามมี มีบางสิ่งที่คุณสามารถลองได้หากคุณยังไม่ได้ลงเส้นทางนั้น

เนื่องจาก ASP.NET โหลดซ้ำจริงๆถ้าคุณแตะไฟล์บางประเภท (web.config (s) เนื้อหาของ/bin/และ/app_code/โฟลเดอร์ส่วนใหญ่) - และมีข้อ จำกัด ที่กำหนดค่าได้สำหรับ "การเปลี่ยนแปลงไฟล์อื่น ๆ " (โดยทั่วไปเมื่อคุณแก้ไขดังนั้น หลาย ๆ ไฟล์ในเว็บไซต์ของคุณแอพพลิเคชั่นจะเริ่มต้นใหม่ - NumRecompilesBeforeAppRestart) คุณสามารถดูสิ่งที่คุณตรวจสอบโฟลเดอร์ที่แตกต่างกันสำหรับ.htmlไฟล์แบบคงที่ (เช่น) บางไฟล์ที่คุณดึงและแสดงตามต้องการหรือใช้LoadControlวิธีที่ใช้เส้นทางสตริง การ.ascxควบคุมผู้ใช้และโหลดแบบไดนามิก - วิธีที่คุณกำหนดว่าจะแสดงเป็นคำถามที่แตกต่างกันซึ่งเหมาะกับ StackOverflow มากขึ้น - แต่ฉันขอแนะนำวิธีแก้ปัญหาการตั้งชื่อตามแบบแผน

คุณสามารถดูการใช้บางอย่างเช่นManaged Extensibility Framework (MEF - ซึ่งเป็นส่วนหนึ่งของ. NET Framework ตั้งแต่รุ่น 4) ซึ่งช่วยให้คุณสามารถเขียนสถาปัตยกรรมแบบปลั๊กอินและระบุโฟลเดอร์นอก/bin/ไดเรกทอรีของคุณเพื่อตรวจสอบ ใหม่. DLLs - แม้ว่าฉันจะไม่พยายามทำสิ่งนี้เพื่อดูว่ามันจะหลีกเลี่ยงปัญหาการรีสตาร์ทแอพหรือไม่ฉันได้ใช้สิ่งนี้เพื่อให้เกิดผลดีในสภาพแวดล้อมเว็บเพื่อเพิ่มฟังก์ชันการทำงานทั่วไปให้กับเว็บไซต์

ถ้านั่นไม่ดึงดูดความสนใจตัวเลือกอื่นที่ฉันคิดว่าน่าจะเพิ่มตัวควบคุมเป็น "โค้ดหน้า" เหมือนกับที่เราทำใน ASP คลาสสิก - นั่นคือ<script runat="server">บล็อกแทนที่จะเป็นคลาส "โค้ด - หลัง" ที่คอมไพล์แล้ว ที่มีตรรกะในการทำงานการควบคุม - นี้จะเอาความต้องการสำหรับการเปลี่ยนแปลง DLL ที่ค่าใช้จ่ายของการสูญเสียประสิทธิภาพการทำงานครั้งแรกในขณะที่การควบคุมจะรวบรวมได้ทันที - อีกครั้งคุณจะต้องสมดุลนี้ด้วยNumRecompilesBeforeAppRestartถ้าคุณ กำลังทำการเปลี่ยนแปลงเล็กน้อยมากมาย

ฉันจะคงเซสชันในแอปรีสตาร์ทได้อย่างไร

นี่อาจเป็นปัญหาที่ง่ายกว่าในการแก้ไขและเกี่ยวข้องกับสามขั้นตอนสำคัญ:

  1. กำหนดค่า MachineKey (IIS7 แต่ยังคงเก็บไว้เป็น 8)เพื่อเป็นค่าคงที่มากกว่าAutoGenerate- ซึ่งหมายความว่าเมื่อ AppPool ทำการรีไซเคิลจะใช้รหัสเดียวกันและจะสามารถถอดรหัสคุกกี้เซสชั่น viewstate และอื่น ๆ จากก่อนหน้านี้ รีไซเคิล
  2. ทั้งการติดตั้งเซิร์ฟเวอร์สถานะหรือการกำหนดค่าฐานข้อมูลที่จะถือสถานะเซสชัน
  3. สลับจากการใช้InProcเป็นStateServerหรือSQLServerในองค์ประกอบ SessionState ใน web.config ของคุณ

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

อย่างไรก็ตามหากคุณอยู่ในตำแหน่งที่ต้องใช้เวลา "หลายนาที" เพื่อให้แอปพลิเคชันเริ่มต้นใหม่หลังจากการปรับใช้คุณอาจต้องการพิจารณาย้ายไปสู่สภาพแวดล้อมที่สมดุลโหลดหรืออย่างน้อยการตั้งค่า Staging / Live แบบถอดเปลี่ยนได้ (เช่นที่จัดทำโดย Azure / AWS / ฯลฯ ) - วิธีนี้คุณสามารถทำให้เซิร์ฟเวอร์ออฟไลน์ในขณะที่คุณอัปเดตหรือทำให้พร้อมกับรหัสใหม่แล้วสลับใน - หากคุณได้ทำตามขั้นตอนเพื่อระบุที่อยู่ที่ใช้ร่วมกัน เซสชัน (ดูด้านบน) สิ่งนี้จะใช้ได้ดีโดยไม่มีผลกระทบกับผู้ใช้


ขอบคุณสำหรับคำตอบยาว ๆ น่าเสียดายที่CMSไม่ใช่สิ่งที่ฉันต้องการ ฉันไม่ต้องการแก้ไขเนื้อหาฉันต้องการเปลี่ยนรหัส ส่วนเกี่ยวกับการประชุมเป็นเพียงตัวอย่าง การเปลี่ยนมันจะไม่ช่วยแก้ปัญหาของเว็บไซต์ที่ถูกขัดจังหวะเป็นเวลาหนึ่งหรือสองนาทีเมื่อมันกำลังโหลดDLLไฟล์ MEFส่วนหนึ่งเป็นที่น่าสนใจ แต่เป็นวิธีการแก้ปัญหาของบุคคลที่สามกับระบบฉันคิดของ ดังนั้น +1 สำหรับความพยายาม แต่น่าเสียดายที่มันไม่ใช่คำตอบสำหรับคำถามของฉัน
Hugo Delsing

1
ฉันได้อัปเดตคำตอบของฉันเพื่อแก้ไขประเด็นเหล่านี้สองสามข้อ: MEF เปิดตัวโดย MS และเป็นส่วนหนึ่งของ. NET Framework ตั้งแต่ v4 คุณสามารถลองใช้โค้ดต่อหน้าสำหรับการควบคุมใหม่ของคุณหรือเลือกใช้การตั้งค่าแบบ load-balance / staging-live ซึ่งจะช่วยให้เซิร์ฟเวอร์ทำงานและใช้งานได้จากนั้นสลับไปมา
Zhaph - Ben Duguid

1
ฉันได้อธิบายวิธีแก้ปัญหาทางเลือกโดยใช้การเริ่มต้นแอปพลิเคชัน ประโยชน์คือการตั้งค่ารหัสและเซิร์ฟเวอร์ทั้งหมดเป็น "ปกติ" โดยไม่มีการโหลดบาลานซ์พิเศษหรือการโหลดการควบคุมแบบไดนามิกทำให้สภาพแวดล้อมการทำงานของคุณง่ายขึ้น แน่นอนการตั้งค่าการโหลดบาลานซ์ / การจัดเตรียมฉากอาจมีประโยชน์สำหรับเหตุผลอื่น ๆ
jeffreypriebe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.