web-dev-qa-db-ja.com

セッション状態の喪失

私は、ユーザーが特定のアクションを正常に完了できないASP.netアプリケーションを持っています。理由は、セッションを失うことにのみ関係していると思われます(現在のユーザー情報を維持し、彼らはログインしています)

彼らがセッションを失う理由について私は途方に暮れているので、最初の質問は:

(一般的に)ユーザーがASP.netでセッションを失う原因は何ですか?

また、ユーザーがセッションを失い、自分でそれを再現できない場合はわかりません。

ユーザーがセッションを失ったときの追跡方法

以下は参照用の私のsessionState設定です

<sessionState
           mode="InProc"
           cookieless="false"
           cookieName="My.Site.Com"
           timeout="480"/>
54
Adam Ritenauer

多くのことが原因で、セッション状態が不可解に消えてしまう可能性があります。

  1. SessionStateタイムアウトが期限切れになりました
  2. AppDomainをリサイクルさせるweb.configまたはその他のファイルタイプを更新します。
  3. IIS recyclesのAppPool
  4. 多くのファイルでサイトを更新すると、ASP.NETはAppDomainをプロアクティブに破棄して、メモリを再コンパイルおよび保存します。

-

IIS 7または7.5を使用している場合、次の点を確認してください。

  1. 既定では、IISは、非アクティブ状態が一定時間続くとAppPoolsがオフになるように設定します。
  2. デフォルトでは、IISはAppPoolsを1740分ごとにリサイクルするように設定します(明らかにルート構成によって異なりますが、これがデフォルトです)
  3. IISで、AppPoolの「詳細設定」を確認します。 「アイドルタイムアウト」というプロパティがあります。これをゼロまたはデフォルト(20)よりも大きい数値に設定します。
  4. IISで、AppPoolの「リサイクル」設定を確認します。ここで、AppPoolのリサイクルを有効または無効にできます。ウィザードの2ページ目は、各タイプのAppPoolがシャットダウンするイベントログに記録する方法です。

IIS 6を使用している場合、同じ設定が適用されます(ほとんどの場合、ただしそれらに到達する方法は異なります)。ただし、リサイクルをログに記録するのは苦痛です。 AppPoolリサイクルイベントを記録するためのIIS 6を取得する方法へのリンク:

http://web.archive.org/web/20100803114054/http://surrealization.com/sample-code/getnotifiedwhenapppoolrecycles/

-

Webアプリでファイルを更新する場合、すべてのセッションが失われることを予期する必要があります。それはただ獣の性質です。ただし、複数回発生するとは思わないかもしれません。 15個以上のファイル(aspx、dllなど)を更新する場合、これらのページはサイトにアクセスするユーザーによって再コンパイルされるため、一定期間にわたって複数回再起動する可能性があります。次の2つのリンクを参照してください。

http://support.Microsoft.com/kb/319947

http://msdn.Microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx

NumCompilesBeforeAppRestartをより高い数値に設定する(または手動でAppPoolをバウンスする)と、この問題はなくなります。

-

セッションの作成時または終了時に通知されるように、Application_SessionStartおよびApplication_SessionEndをいつでも処理できます。 HttpSessionStateクラスには IsNewSession プロパティもあり、ページリクエストをチェックして、アクティブなユーザーに対して新しいセッションが作成されたかどうかを判断できます。

-

最後に、あなたの状況で可能であれば、私は SQL Serverセッションモード を使用し、成功しました。大量のデータを格納する場合(すべての要求がSQL Serverからすべてのデータを読み込んで保存する場合)はお勧めできません。カスタムオブジェクトを(シリアル化可能でなければならないので)入れると苦痛になる場合があります)、しかし、数時間リサイクルしないようにAppPoolを構成できなかった共有ホスティングシナリオで役立ちました。私の場合、限られた情報しか保存しておらず、パフォーマンスへの悪影響はありませんでした。これに加えて、既存のユーザーはデフォルトでSessionIDを再利用し、ユーザーはすべての状態がSQL Serverに保存されているため、メモリ内のセッションがAppPoolリサイクルによって削除されたことに気付きませんでした。

103
Adam Sills

私の場合、[アプリケーションプール]-> [詳細設定]-> [最大ワーカープロセス]を1に設定すると役に立ちました。

2
Michael

ASP.NET 4.0では、ページリクエストごとにセッションがリセットされるという状況が発生していました(また、ページリクエストごとにSESSION_STARTコードが実行されます)。これは、すべてのセッションですべてのユーザーに発生するわけではありませんでしたが、通常は発生し、発生すると、ページリクエストごとに発生します。

Web.configのsessionStateタグの設定は、上記のものと同じでした。

cookieless="false"

次のように変更したとき...

cookieless="UseCookies"

...問題は解決したようです。明らかにtrue | falseはASP.NET 1の古い選択肢でした。ASP.Net2.0から、列挙された選択肢が利用可能になりました。これらのオプションは廃止されたと思います。 「false」の値は、過去に問題を示したことはありません。ASP.NET4.0でしか気づいていません。 4.0で正しくサポートされなくなったものがあるかどうかはわかりません。

また、私はこれを少し前に発見しました。以前は問題が断続的だったため、まだ発生する可能性がありますが、これまでのところ、この新しい設定で機能しています。

2
Rick

セッションは失われます...

セッションが失われるシナリオを見つけました-asp.netページで、金額テキストボックスフィールドに無効な文字があり、その後に他の目的のためのセッション変数の取得が続きます。最初のチャンスの例外を発生させますが、その行にはエラーが表示されません.

ヒント:失敗するようにシステムをテストします。破壊的です。たとえば、無関係なシナリオで十分なジャンクを入力します。検索結果が表示されたら、検索条件にジャンクを入力し、検索結果の詳細に移動します...ローカルコードベースも... :)

それが役立つことを願って、hydtechie

1
HydTechie

文字列または整数ではなく、データ行であるセッションのみが失われていました。データをシリアライズ可能なオブジェクトに入れて、セッションに保存することは私にとってはうまくいきました。

0
Gert R.

Ajax経由でコンテンツを取得するときにIIS 8に問題がありました。問題はMaximumWorkerProcesses2に設定され、Javascriptが17の同時リクエストを開くことでした。 AppPoolは処理でき、新しいプール(認証データなし)が開かれました。

解決策は、0MaximumWorkerProcessesIIS -> Server -> Application Pools -> [myPool] -> Advanced Settings -> Process Model -> MaximumWorkerProcessesに変更することでした。

0
Martin Seitl

それがあなたの問題に関連しているかどうかわからないが、Windows 2008 Server R2またはSP2はそのIIS設定を変更し、セッション永続性の問題につながる。 HTTPSで変数を設定すると、変数はHTTPSページでのみ切り替え可能になります。

この問題を解決するには、IIS設定です。IIS Managerで、ASPプロパティを開き、展開します- セッションプロパティ、およびセキュア接続の新しいIDFalseに変更します。

0
SRK - Khurram

Session_StartおよびApplication_StartでGlobal.asaxにログを追加して、ユーザーのセッションとアプリケーション全体で何が起こっているかを追跡できます。

また、Webファームモード(アプリケーションプールで複数のIISスレッドが定義されています)または負荷分散で実行していることに注意してください。同じメモリ:この場合、セッションモードをSQL Serverに切り替えることができます。

0
Jemes