3

大規模な Web アプリケーション (dll は約 1 MB) の新しい DLL をアップロードすると、DLL が「使用中」であるため、IIS はエラーをスローします。これは、DLL のアップロード中に Web サイトがダウンしていることを意味します。この動作を停止する方法はありますか?

また、Web サイトではなく Web アプリケーションを使用していますが、新しい DLL をアップロードするたびに、新しいアップロード後に IIS が再起動するのに時間がかかります。Web アプリケーションではなく、IIS でコンパイルする必要があるため、この待機は一般に Web サイトのみであると思いましたか?

4

2 に答える 2

2

AARをいくつかの Powershell スクリプトと一緒に使用して、ダウンタイムなしで同じマシンにデプロイできます。

基本的に 3 つのサイトを設定します。1 つはリクエストをリッスンし、それらを ARR に渡します。ARR はリクエストを他の 2 つのサイトのいずれかにリダイレクトします。一度にアクティブにできるのは、これら 2 つのサイトのうち 1 つだけです。

展開するときは、停止したサイトに新しいファイルをコピーし、ウォームアップしてから、このノードへの要求の転送を開始するよう ARR に指示します。この時点で、古いコードを含むサイトをオフラインにすることができます。

このスクリプトは、このプロセスをほぼ自動化します。次のファイル/サイト/webfarm 構造を想定しています。

ファイル構造

  • C:\PATH_TO_YOUR_CODE\$projectName (このフォルダーにはデプロイするファイルが含まれています)
  • C:\PATH_TO_YOUR_CODE\$projectName-Green (最初は空でもかまいません - このノードをアクティブ化すると、展開ファイルがここにコピーされます)
  • C:\PATH_TO_YOUR_CODE\$projectName-Blue (最初は空でもかまいません - このノードをアクティブ化すると、展開ファイルがここにコピーされます)

IIS サイト

  • "$projectName" (ARR サイト) 実行中
  • "$projectName-Green" (バランス サイト グリーン) 停止
  • "$projectName-Blue" (バランス サイト ブルー) 停止

ウェブファーム

  • 「$projectName-農場」
  • 「$deploymentBlueNodeAddress」は利用できません
  • 「$deploymentGreenNodeAddress」は利用できません
于 2013-03-04T11:40:48.687 に答える
1

このような変更を行うとすぐに、依存関係を効果的に変更したことになります。ASP.NET のシャドウ コピー フォルダーでサイトを再コンパイルする必要があります。

アップデート:

あなたのコメントに基づいて:誰かが e コマース サイトでアイテムを購入し、同時に新しい更新がプッシュされた場合はどうなりますか? それは.NETの私のバグベアの1つです(PHPについて見逃していることの1つは、手間をかけずにPHPファイルを簡単にアップロードできることでした)

サーバーが 1 台しかない場合は、更新を計画し、アップグレードのためにサイトが利用できなくなることを事前に警告する必要があります。と呼ばれる ASP.NET の機能がありますApp_Offline.htm。これは、アプリケーションに存在する場合、要求されたページに関係なく、ASP.NET がそのコンテンツをレンダリングする特別なページです。これを使用して、サイトがメンテナンスのためにオフラインであることをユーザーに説明するメッセージを表示できます。詳細については、Scott Guthrie のブログ を参照してください

この方法でサイトのアップグレードにアプローチすることは不合理ではありません。これは、単一のアトミック ステップでサイトの更新を実行するメカニズムであり、ユーザーが気にしない事前の警告をユーザーに十分に提供する場合です (おそらく、トラフィックが典型的な最低点)。

あなたは、PHP ではこの問題は発生しないと述べています。実際、関連のないページを 2 つ以上更新する場合は、当然ながら、アップグレード中にユーザーがサイトにアクセスできないようにする必要があります。

おそらく e コマース アプリケーションの一部として、関連性の低い 5 ~ 6 ページを更新しているとします。アップロード プロセス中に最初のページをデプロイすると、それがユーザーに提供されます。このページに加えた変更の 1 つは、フォームに新しいフィールドを追加することでした。ページは、このフィールドを使用する別の PHP スクリプトにポスト バックします。次の 2 つのシナリオがあります。

  1. ポストバック ページは新しく、まだアップロード キューにあります。これにより、新しくアップロードされたスクリプトが壊れます。これは、ユーザーが [送信] をクリックしても送信先がないためです。

  2. ポストバック ページは既に存在しますが、更新されていません。このページは、フォームの投稿フィールドをデータベースに書き込みます。この新しいフィールドをデータベースに追加しましたが、これは必須フィールドであり、null にすることはできません。まだ更新されていないポストバック スクリプトは DB を更新しようとしますが、新しいフィールドがポストバック フォームの INSERT ステートメントにないためエラーが発生し、NULL で NOT NULL 制約違反が発生します。

私は続けることができました。あなたのサイトがほんの些細な量以上の機能を提供している場合は、すべての更新のためにオフラインにして、更新されたすべてのコードが単一のアトミック更新で展開されるようにする必要があります。

于 2011-01-15T01:37:57.007 に答える