しばしば壊れたapp_offline.htmハックの代替案は何ですか?
-
22-10-2019 - |
質問
かなりのシナリオで、配置 app_offline.htm
ルートではちょうどいいです。いくつかの更新を行い、更新中にメッセージが表示されます。アイデアは、マイクロソフトが言うように、それ以前 なんでも 呼び出されます、IISは最初にapp_offline.htmがそこにあるかどうかをチェックします。もしそうなら、それはすべてをキャンセルして表示します。
ですから、とても良いことですが、多くの状況ではうまくいきません:
- ASPXページにコンパイルエラーがあり、ユーザーが直接リンクしている場合
- 競合するアセンブリがあるとき
- web.configに解析エラーがある場合
- サイト全体を削除 /アップロードする最中。
- 静的HTMLページへの直接リンクはまだそのように表示されます
- メッセージが表示される前に、ファイルなし、アクセスが整えられます
おそらく、失敗するシナリオが存在する可能性があります。私のポイントは、真剣な更新作業の場合、app_offline.htmは適していません。私は時々IISで別のサイトにリダイレクトを作成しますが、別のサイトが常に利用可能であるとは限らず、ユーザーを混乱させることができます。
理想的には、エンドユーザーのURLロケーションバーの現在の場所を保持し、メッセージを表示し、毎分ページを自動再生して、サイトが戻っているかどうかを確認したいので、ユーザーが彼の場所を続けるようにしたいと思います。サイトが戻ってきたときの左。静的ページでは技術的には簡単ですが、上記の理由でエラーがスローされる瞬間に失敗します。
解決
他の誰もweb.configと再コンパイルについて言及していないので、ここにあります。この問題に遭遇しました。私はそれが「製品の使用を意図していない」と言った人には同意しません:VS 2010は、展開するときにapp_offlineを使用してコードに焼き付けられます。
回避策(クレジットはカートシンドラーに送られます、 ブログ投稿はこちら).
- app_offline.htmをサイトにコピーします
- このように見えるweb.configを作成します(以下の番号付きブロックを参照)
- そのweb.configをリモートディレクトリにコピーします
- あなたの本当のweb.configを除くすべてのサイトファイルをリモートdirにコピーします
- Real web.configをリモートディレクトリまでコピーします(再コンパイルを開始する必要があります)
web.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<httpRuntime waitChangeNotification="300"
maxWaitChangeNotification="300"/>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
</configuration>
これの結果はそれです VS 2010アプリの展開を直接使用することはできません エンドユーザーが展開中にYSODが表示されないことを気にする場合。したがって、これを行うには、Nantまたは他の展開ツールを使用する必要があります。
他のヒント
私が見た1つの方法は、非常に高度にトラフィックの多いサイトで処理されていることです。INETPUBディレクトリに複数のフォルダーがあることです。何かのようなもの:
inetpub
\ site2011-02-03
\ site2011-03-14
「Site2011-02-03」は既存のサイトであり、「Site2011-03-14」が今日プッシュされている場所です。新しいフォルダーへのプッシュが完了すると、IISサイトを変更して新しいディレクトリを指します。障害の場合、IISを古いバージョンに変更します。
率直に言って、app_offline.htmを使用するときに話すエラーに遭遇したことはありません。サイトを倒すために常に適切に機能しています。ページへの直接リンクでも。ここで何か他のことが起こっているかもしれないと思います。また、IIS 7と7.5(2008 R2)を使用しました。
アップデート
構成を調べました。 App_offline.htmは、サーバーの上位デフォルトドキュメントとしてマッピングされています。それは緩和要因かもしれません。
実際のWebアプリがオフラインである間に、「オフライン」Webアプリを使用するというアイデアが気に入っています。適切なアプリケーションを指すように、WebディレクトリにSymlinkを設定します。
あなたのセットアップは次のように見えるかもしれません:
web_dir(これはiisがwww.yourdomain.comを提供するディレクトリです)
WebApps
- 実際のwebapp
- offlinewebapp
シナリオ:アプリはオンラインです
web_dir-> actualwebapp(web_dirはeacerwebappにリンクされています)
シナリオ:アプリはオフラインです
web_dir-> offlinewebapp(web_dirはofflinewebappにリンクされています)
基本的に、実際のWebアプリと「オフライン」Webアプリの2つの異なるWebアプリケーションが表示されます。これにより、ユーザーを別のサイトにリダイレクトする柔軟性が得られますが、ドメインであるように見えます。
実際のWebアプリは、実際のWebアプリケーションです。これはあなたが変更したものであり、実際のコンテンツを持っているものです。
「オフライン」Webアプリにはコンテンツがほとんどありません。たぶんそれはあなたがあなたの質問で言及した静的ページのみを含んでいます。ページリクエストを処理し、オフラインメッセージを表示し、毎分リロードするためのルーティングがあるかもしれません。
IIS Webディレクトリは、実際にはこれら2つのWebアプリのいずれかへのリンクです。通常、実際のWebアプリにリンクされます。 Webアプリの展開を(再)開始する準備ができたら、Webディレクトリを変更して代わりに「オフライン」アプリをポイントします。展開が完了したら、リンクを変更して、実際のWebアプリをもう一度指すようにします。
app_offline.htmはそうだとは思わない 意図されました 生産用に。
私のソリューションは、すべての要求をキャッチし、要求されたサイトのクエリ文字列と元のリクエストを再試行するいくつかのJavaScriptを備えた静的.htmページにリダイレクトするモジュールを使用して個別のWebアプリケーションを作成することです。
メンテナンスの準備ができたら、ダミーアプリケーションをセットアップして、すべてのリクエストをドメインに処理します。メンテナンスを行っているときに別のポートを使用して、またはテストできるようにすると、一時的なドメインを使用します。完了したら、それらを元に戻し、待機することを決めたユーザーは、当初の要求されたページにリダイレクトされる必要があります。
私はこれの半分しか実行しなかった(アプリケーションポートを切り替えて更新されたサイトをオンにする)ので、希望するユーザーエクスペリエンスを取得するための他の手順が存在する場合があります。
お役に立てれば。
私たちの場合、app_offline.htmは、web.configページのセクションをコメントするまで機能していませんでした。予想通り、app_offline.htmの代わりに定義したエラーページにリダイレクトされます。
古い投稿、私は知っていますが、私はまだこれを見ていませんでした:
- app_offline.htmを使用して新しいサイトを作成します。
- 更新されているサイトにapp_offline.htmlを追加します。
- 更新されているサイトからバインディングを削除します。
- AppOfflineサイトにバインディングを追加します。
- ターゲットサイトに特別なバインディングを追加します(ポート#または他のバニティURLを使用して、IPフィルタリングまたは必要なものをすべて実行します。)
- ターゲットサイトで検証を行います。
- AppOfflineからターゲットサイトへのバインディングを復元します。