リロードせずに.NET Webサイトを更新する


13

私は中にウェブサイトを開発するために使用PHPしてASP classic変更するために必要な何かをしている場合。単一または複数のファイルを変更するだけで、誰も気付かないでしょう。おそらく、アップロード中に誰かが変更されたファイルをリクエストしたとしても、それは0.5秒のマージンのようなものです。ほとんどの小規模なサイトでは問題ありません。

ただし、最新のサイトはビルドされてC# MVCおり、コードに変更を加えた場合は、Webサイトを再構築し、変更されたDLLファイルをアップロードする必要があります。ただし、DLLファイルを変更すると、Webサイトが再起動され、すべてのアクティブなファイルがリセットされますsessions。また、すべてをリロードする必要があり、大規模なサイトではすべてをロードするのに数分かかる場合があります。サイトを閲覧していた人は誰でも気づき、再度ログインする必要があります。

主要なサイトの更新はそれほど一般的ではないので、それは問題ではありません。ただし、プロモーションの定期的な「小さな」更新があります。「このフォームに記入して3か月間無料のメンバーシップを取得する」または「...の画像をアップロードした最初の10人が価格を受け取ります」のように。あなたはドリフトを得ると思います。一部のプロモーションは類似しており、設定に基づいて適切な情報を表示するモジュールで処理できますが、多くの場合、カスタムコードが必要です。

私は、各プロモーションは、それ自身でシステムを考えていたDLLインターフェイスに基づいてファイルして、ロードDLL使用して動的にType.GetTypeActivator.CreateInstanceInvokeMember。それはうまくいくかもしれませんが、それが正しい方法かどうか疑問に思っています。

だから私の質問:.NETサイト全体をリロードしてセッションをドロップせずに、その場でサイトを更新するにはどうすればよいですか(アプリケーションプールのリサイクルなど)。


あなたの賞賛のコメントに応えて:私が取り組んでいる大きなウェブサイトは、コードへの大きな変更を処理するのと同じ方法で、ロードバランサーとアウトプロセスセッションを通して、小さな変更をコードに処理します-ライブにデプロイされるすべてのコードは、レビュー/サインオフプロセス。サーバーにコードをドロップすることはできません。「大」の定義が一致しない可能性があります;)
ザップ-ベンデュグイド

回答:


11

「アプリケーションの初期化」IIS 7.5、Windows 2008 R2(セットアップが難しい)IIS 8、Windows 2012

アプリの初期化により、すべてのアプリケーション(サイトではなくアプリケーションプール)を再起動し、古いアプリケーションを使用して、新しいアプリケーションの起動をウォームアップしながら、以前のアプリケーションを実行できます。新しいアプリケーションがスピンアップすると(設定可能なURLによって決定されます)、新しいアプリケーションの使用が開始され、以前のアプリケーションがシャットダウンされます。アプリの初期化をメソッドと組み合わせて使用​​し、アプリケーションプールの再起動後もセッションが維持されるようにすると、サイトをシームレスに再起動できます。(Zhaphはマシンキーについて十分な注意を払っています。)

アプリの初期化設定に関する上記のリンクに加えて、サイトの再起動をトリガーするものを確認する必要があります。サイトの再起動はアプリケーションの初期化を使用しないため、サイトの再起動はシームレスではありません。

IISを構成して、DLLの更新がすぐにサイトの再起動やweb.configの変更をトリガーしないように構成できます(サイトに関連するhttpRuntimeおよび外部構成ファイルのChangeNotificationの値が高い)。

最終結果は、サイトを再起動せずにDLL /コードを更新し、AppInitializationバックグラウンドウォームアップを使用してアプリを強制的に再起動して、コードをシームレスに変更できることです。

これらのことをコンサートで行うと、シームレスな再起動に非常にうまく機能します。


そこにある一連のステップ-考慮すべきことは確かです:)
ザーフ-ベンデュグイド

これは私が探していたもののように聞こえます。それを試して設定しようとしています。ありがとう
ヒューゴデルシング

@HugoDelsingそれがあなたにとって素晴らしい作品になることを願っています。
jeffreypriebe

ありがとう、これは私が最終的に使用したものであり、うまく機能します。
ヒューゴデルシング

@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-バージョン4以降、.NETフレームワークの一部である)のようなものを使用することも検討できます。これにより、プラグインベースのアーキテクチャを記述し、/bin/監視するディレクトリ外のフォルダーを指定できます。新しい.DLL-アプリの再起動の問題を回避するかどうかを確認するためにこれを試したことはありませんが、サイトに一般的な機能を追加するためにWeb環境でこれを使用して効果を上げました。

それが魅力的でない場合、私が考えることができる唯一の他のオプションは、古典的なASPで行ったようにコントロールを「コードインフロント」として追加することです。つまり<script runat="server">、コンパイルされた「コードビハインド」クラスの代わりにブロックを使用することです制御を実行するためのロジックが含まれている-制御がオンザフライでコンパイルされているので、これは、いくつかの最初の時のパフォーマンスの損失を犠牲にして、DLLの変更の必要性を除去します-もう一度あなたとこのバランスを取る必要がありますNumRecompilesBeforeAppRestartあなたの場合'多くの小さな変更を行っています。

アプリの再起動後もセッションを維持するにはどうすればよいですか?

これはおそらく解決しやすい問題であり、3つの重要な手順が含まれます。

  1. MachineKey(IIS7、ただし8を保持)を一定の値ではなく構成しますAutoGenerate-これは、AppPoolのリサイクル時に同じキーを使用するため、以前からセッションCookie、ビューステートなどを復号化できることを意味しますリサイクル。
  2. どちらの設定状態サーバーまたはセッション状態を保持するデータベースを設定
  3. を使用InProcするStateServerSQLServer、web.configのSessionState要素で切り替えます。

これにより、アプリの再起動後も存続する永続的なセッションが実現します。ただし、これらは「無料」ではありません。セッションに保存するものはすべてシリアル化可能でなければならず、ページの読み込みごとにネットワークデータを取得してセッションデータを解放する必要があるため、わずかなパフォーマンスヒットが発生します。

ただし、展開後にアプリケーションが再起動するのに「数分」かかる場合は、負荷分散環境、または少なくともホットスワップ可能なステージング/ライブセットアップへの移行を検討することをお勧めします。 (Azure / AWSなどによって提供されるものなど)-この方法では、サーバーを更新中にオフラインにするか、新しいコードで準備してからスワップインできます-共有に対処するための手順を実行した場合セッション(上記参照)は、ユーザーに影響を与えることなく正常に機能します。


長いご回答ありがとうございます。残念ながら、CMS私は欲しいものではありません。コンテンツを変更したくない、コードを変更したい。セッションに関する部分はほんの一例です。変更しても、サイトがDLLファイルをリロードするときに1、2分間停止するという問題は解決しません。このMEF部分は興味深いものでしたが、私が考えていたシステムに対するサードパーティのソリューションです。努力のために+1しましたが、残念ながら、それは本当に私の質問に対する答えではありません。
ヒューゴデルシング

1
これらのポイントの2つに対処するために回答を更新しました。MEFはMSによってリリースされ、v4から.NETフレームワークの一部となっています。。あなたが代わりに起動して実行サーバーを取得することを可能にし、その後でそれを交換します負荷分散/ステージング、ライブのセットアップを採用し、新しいコントロールのコード・イン・フロントを使用して試みることができる
Zhaph -ベンDuguid

1
アプリケーション初期化を使用した代替ソリューションの概要を説明しました。利点は、特別な負荷分散や動的な負荷制御なしで、すべてのコードとサーバーのセットアップが「通常」であり、実行環境をよりシンプルに保つことです。もちろん、負荷分散/ステージングライブセットアップは、他の理由で役立つ場合があります。
jeffreypriebe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.