質問

私は現在開発中のC#/ASP.NETのウェブサイトを持っています。私たちが生産されているとき、私はバグを修正して機能を追加するので、一日中に頻繁にリリースをしたいと思います(このようなもの: http://toni.org/2010/05/19/in-praise-of-continuous-deployment-the-wordpress-com-story/).

サイトの新しいバージョンをアップロードしたり、単一のファイルを変更したりすると、現在ログインされているユーザーがキックアウトし、あらゆるフォームなどを開始します。 .NETサイトのユーザーを妨害することなく展開を行うことができる秘密はありますか?

役に立ちましたか?

解決

構成ファイル、アプリのビンフォルダーの内容、またはそのようなものに変更を加えると、ASP.NETワーカープロセスはアプリケーションとともに再起動します。

これにより、セッションが削除され、ユーザーがキックアウトされます。

解決策は、デフォルト以外の他のセッションストレージ方法を使用することです InProc.
これを設定することでこれを達成できます セッション状態モード. 。 SqlServerStateServer オプションはあなたの問題に対して非常に良い救済策を提供します。

SqlServer モードは比較的簡単にセットアップして起動して実行できます。 (基本的に、データベースを作成し、ASPNET_REGSQLを実行し、次に構成に指定しているだけです。)SQLサーバーを持っていないか、使用したくない場合は、使用できます。 StateServer, 、または独自のプロバイダーを作成して使用します Custom モード。

唯一の制限は、シリアル化可能な値のみを保存できることです SqlServerStateServer モード。

他のヒント

これを見ている理由は、アプリケーションプールをリセットしているため、全員のセッションをリセットしているためです。

最もクリーンなルートは、セッションをセッションステートサーバーにオフロードするか、セッションの使用を最小限に抑えることです。

これを回避する1つの方法は、セッションをオフロードできない場合、常に新しい仮想ディレクトリに展開することです。その後、あなたの一般のFaceing URLは、最新バージョンにリダイレクトするだけです。すでにログインしているすべてのユーザーは、古いバージョンを引き続き使用しますが、新しいユーザーは新しいバージョンを使用します。

それを達成するための2つの選択肢があります:

  1. セッションをまったく使用しないでください。 (認証にはCookieを使用できます)
  2. 別のセッションステートモードを使用します。ステートサーバーまたはSQLServer。 http://msdn.microsoft.com/en-us/library/ms178586(v=vs.80).aspx

いずれにせよ、パフォーマンスやフェイルセーフクラスタリングのために複数のサーバーでアプリケーションを実行できるようにする柔軟性を獲得します。

セッションオブジェクトに保存するものによっては、Global.AsaxのSession_startハンドラーで再構築できる場合があります。私はこれをセッションでユーザーの身元のみを実際に保存した内部アプリケーションでこれを行っていたので、彼らの認証Cookieを使用してセッションを再現することができました。

これを行うと留意すべきことの1つは、ユーザーがフォームをロードして昼食のために出発し、それらが不在の間にそのページを更新するとします。彼らが自分の机に戻ってフォームを送信する場合、彼らはフォームの古いバージョンを新しいコードビハインドに送信するでしょう。

Webサーバーのアプリケーションプロセスが再起動されるため、ユーザーはキックされていると思います。デフォルトでは、ユーザーセッションはメモリに保存され、セッションデータが殺されます。セッションプロバイダーは、web.configで設定可能なオプションです。外部(WEB-Application-Process)セッションプロバイダーを選択している可能性があります。これは、期待しているものへの一歩です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top