Chúng tôi đã có một máy chủ IIS lưu trữ hàng trăm ứng dụng web riêng biệt và máy chủ cơ sở dữ liệu vật lý lưu trữ các ứng dụng này sẽ được đưa ra ngoại tuyến để bảo trì trong một thời gian ngắn (chúng tôi hy vọng sẽ mất ít hơn 15 phút).
Trong khoảng thời gian đó, chúng tôi muốn chuyển hướng TẤT CẢ lưu lượng truy cập, đối với bất kỳ trang web nào, đến trang "chúng tôi hiện đang bảo trì".
Tôi nhận ra rằng tôi có thể làm điều này bằng cách truy cập mọi ứng dụng web và thiết lập quy tắc viết lại IIS để gửi người dùng đến một trang khác cho tất cả các yêu cầu trong ứng dụng đó. Nhưng, chúng tôi sẽ mất nhiều thời gian hơn để làm điều đó hơn là bảo trì cơ sở dữ liệu!
Tôi đã thử ba thứ, không cái nào trong số đó có tác dụng:
Quy tắc viết lại IIS toàn cầu
Tôi đã tìm kiếm một cách đơn giản để áp dụng quy tắc cho tất cả các trang web, trong một cú trượt - và sau đó có thể "hoàn tác" quy tắc đó trong một bước không đau đớn như nhau. Cho đến nay, không có nỗ lực của tôi đã làm việc. Tôi đã thử đặt quy tắc viết lại này trong web.config toàn cầu của mình tại 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>
Điều này đã không làm việc. Chúng tôi đang chạy .NET 4.0 64 bit trong IIS, nhưng "chỉ trong trường hợp" tôi đặt điều tương tự với các tệp web.config toàn cầu 32 bit và 2.0, và vẫn không thay đổi.
App_ Offerline.htm "tập tin đặc biệt"
Một đề xuất khác mà tôi đã thấy là tệp "đặc biệt" app_offline.htm , nhưng chúng tôi lại gặp vấn đề tương tự về việc mất nhiều thời gian hơn để triển khai tệp này vào thư mục gốc của tất cả các ứng dụng của chúng tôi so với việc bảo trì.
Trang web "Chúng tôi ngoại tuyến" trong IIS
Tất cả các trang web của chúng tôi được thiết lập trong IIS với một IP duy nhất. Điều này hoạt động với chúng tôi ngay cả khi không có SNA vì tất cả các ứng dụng của chúng tôi đều có chung một chứng chỉ SSL (đó là UCC). Một điều xảy ra với tôi là có lẽ tôi có thể thiết lập một trang web trong IIS khớp với tất cả lưu lượng truy cập đến IP mà chúng tôi đang sử dụng và không chỉ định giá trị tiêu đề máy chủ. Hy vọng là tôi có thể cung cấp cho nó "quyền ưu tiên" cao hơn và khi được bắt đầu, nó sẽ khớp tất cả lưu lượng truy cập với IP đó, trước khi bất kỳ trang web nào khác có cơ hội phù hợp. Tôi có thể thiết lập trang web đó để phục vụ cùng một trang cho tất cả các yêu cầu, bất kể URL yêu cầu.
Bắt đầu trang web đó khi đang bảo trì và dừng lại khi hoàn thành.
Nhưng, tôi cũng không thể làm việc này được, vì IIS dường như khớp một yêu cầu HTTP với một trang web cụ thể hơn trước khi ít cụ thể hơn. Vì vậy, bằng cách bỏ qua giá trị tiêu đề máy chủ cho trang web "nói với người dùng chúng tôi ngoại tuyến", nó sẽ không được khớp trừ khi yêu cầu không có giá trị tiêu đề máy chủ phù hợp với trang web khác. Điều này đặt chúng ta trở lại cùng một vấn đề là phải truy cập thủ công từng ứng dụng web và thực hiện một hành động để đưa nó ngoại tuyến và sau đó đưa nó trở lại trực tuyến khi chúng tôi hoàn tất bảo trì
Có một cách đơn giản để thực hiện điều này? Dường như chắc chắn chúng ta không phải là người đầu tiên gặp phải vấn đề này.
-Josh