เรามีเซิร์ฟเวอร์ IIS ที่โฮสต์หลายร้อยเว็บแอปแยกต่างหากและเซิร์ฟเวอร์ฐานข้อมูลทางกายภาพที่โฮสต์แอปเหล่านี้จะถูกออฟไลน์เพื่อการบำรุงรักษาเป็นระยะเวลาสั้น ๆ (เราคาดว่าจะใช้เวลาน้อยกว่า 15 นาที)
ในช่วงเวลานั้นเราต้องการเปลี่ยนเส้นทางการเข้าชมทั้งหมดที่เข้ามาในเว็บไซต์ใด ๆ ไปยังหน้า "เรากำลังอยู่ระหว่างการบำรุงรักษา"
ฉันรู้ว่าฉันสามารถทำได้โดยไปที่ทุกเว็บแอปและตั้งค่ากฎการเขียน IIS ซ้ำที่ส่งผู้ใช้ไปยังหน้าอื่นสำหรับคำขอทั้งหมดในแอปนั้น แต่เราจะต้องใช้เวลานานกว่านั้นในการดูแลฐานข้อมูล!
ฉันลองสามสิ่งแล้วไม่มีสิ่งใดที่ได้ผล:
กฎการเขียนซ้ำสากลของ IIS
ฉันค้นหาวิธีง่ายๆในการใช้กฎกับไซต์ทั้งหมดในคราวเดียว - จากนั้นสามารถ "เลิกทำ" กฎนั้นในขั้นตอนที่ไม่เจ็บปวดอย่างเท่าเทียมกัน จนถึงตอนนี้ความพยายามของฉันก็ไม่ได้ผล ฉันลองใส่กฎการเขียนซ้ำนี้ใน web.config ทั่วโลกของฉันที่ W: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="redirect all requests" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
</conditions>
<action type="Redirect" url="http://www.somedomain.com/maintenance" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
สิ่งนี้ไม่ทำงาน เราใช้. NET 4.0 64 บิตใน IIS แต่ "ในกรณี" ฉันใส่ไฟล์ web.config 32 บิตและ 2.0 ทั่วโลกในสิ่งเดียวกันและยังคงไม่มีการเปลี่ยนแปลง
App_Offline.htm "ไฟล์พิเศษ"
ข้อเสนอแนะอีกข้อหนึ่งที่ฉันเคยเห็นคือไฟล์app_offline.htm "พิเศษ"แต่เรากลับพบปัญหาเดียวกันกับที่มันใช้เวลานานกว่าในการปรับใช้ไฟล์นี้กับรากแอพของแอพทั้งหมดของเรามากกว่าที่จะทำการบำรุงรักษาจริง
ไซต์ "เราออฟไลน์" ใน IIS
เว็บไซต์ทั้งหมดของเราติดตั้งใน IIS ด้วย IP เดียว สิ่งนี้ใช้ได้สำหรับเราแม้ไม่มี SNA เพราะแอปทั้งหมดของเราใช้ใบรับรอง SSL เดียว (เป็น UCC) สิ่งหนึ่งที่เกิดขึ้นกับฉันคือบางทีฉันอาจตั้งค่าไซต์ใน IIS ที่ตรงกับปริมาณการใช้งานทั้งหมดกับ IP ที่เราใช้และไม่ได้ระบุค่าส่วนหัวของโฮสต์ ความหวังคือฉันสามารถให้ "ลำดับความสำคัญ" ที่สูงขึ้นและเมื่อเริ่มต้นจะจับคู่อัตราการเข้าชมทั้งหมดกับ IP นั้นก่อนที่เว็บไซต์อื่นใดจะมีโอกาสตรงกัน ฉันสามารถตั้งค่าไซต์นั้นเพื่อให้บริการหน้าเดียวกันสำหรับคำขอทั้งหมดโดยไม่คำนึงถึง URL คำขอ
เริ่มต้นไซต์นั้นเมื่ออยู่ระหว่างการบำรุงรักษาและหยุดเมื่อเสร็จสิ้น
แต่ฉันก็ไม่สามารถทำงานได้เช่นนี้เนื่องจาก IIS ดูเหมือนจะจับคู่คำขอ HTTP กับไซต์ที่เฉพาะเจาะจงมากขึ้นก่อนที่จะเจาะจงน้อยลง ดังนั้นโดยการละเว้นค่าส่วนหัวของโฮสต์สำหรับไซต์ "แจ้งให้ผู้ใช้ทราบว่าเราออฟไลน์" จะไม่ได้รับการจับคู่เว้นแต่คำขอจะไม่มีค่าส่วนหัวของโฮสต์ที่ตรงกับไซต์อื่น ซึ่งทำให้เรากลับมามีปัญหาเดียวกันกับที่ต้องไปที่แต่ละเว็บแอปด้วยตนเองและดำเนินการเพื่อออฟไลน์แล้วนำกลับมาออนไลน์เมื่อเราทำการบำรุงรักษาเสร็จแล้ว
มีวิธีง่ายๆในการทำสิ่งนี้หรือไม่? ดูเหมือนว่าเราไม่ใช่คนแรกที่จะพบปัญหานี้
-Josh