Global.ASAの古典的なASPエラー:必要なオブジェクト:「セッション」
-
24-10-2019 - |
質問
Windows 2003マシン上のサーバーサイドVB ASPコード、ASP.NET 2.0*インストール。ユーザーが初めてWebサイトに接続したとき、Global.asa FireのSession_Onstartであるが、セッションオブジェクトはnullであるという奇妙な問題があります。シンプルなもの:
Session.Timeout = 30
次のエラーを引き起こします:必要なオブジェクト:「セッション」
WebサイトはIIS Manager Home Directoryタブで「作成」されており、サイトの構成ページでセッションが有効になっています。
ほとんどの場合、ユーザーがページを再表示すると、セッションオブジェクトが存在します。しかし、一意のユーザーの最初の訪問は常にエラーを引き起こします。
提案?古いWin2000システムで機能したため、コードにはエラーがありません。
繰り返しますが、.NET 2.0がインストールされたIIS6を実行しているWindows 2003サーバー。 Webサイトは、仮想ディレクトリではなくアプリケーションとして実行されています。
解決
問題を理解しました。これは、ウェブサイトに使用されるアプリプールに複数の労働者がいるためでした。どの労働者プロセスがクライアントの要求を処理するかを保証し、各ワーカープロセスがクライアントのセッションの独自のインスタンスを作成するため、IISが別のワーカープロセスがリクエストを処理することを決定したときにセッションが削除され、再作成されます。問題は、アプリプールで1つのワーカープロセスのみを使用し、他のすべてのWebサイトをアプリプールから独自のWebサイトから取り出すことで解決しました。
私は今、アプリプールに複数の労働者を置く方法を探していますが、クライアントにワーカープロセスに固執するようにしています。しかし、それは私が研究する別の問題です。
他のヒント
非常に興味深い問題。
セッションが明示的に放棄されるか、最終的にタイムアウトすると、すぐに破壊されることがわかります。それが起こることができないことを保証するために、次のようなコードを追加します。
If Session("test") Is Nothing Then
Response.Redirect("Whatever.asp")
End If
また、このブロックでオブジェクトを作成するコードを呼び出すこともできます。このように、セッションが何らかの形で破壊されたことを検出した場合、それらを再現することができます。