0

私の Web アプリケーションは、何らかの理由でセッション値を失っています。これは、外部 Web ページが呼び出された後に発生します。私のアプリケーションは非常に大きいため、大きな変更を行うには時間がかかりすぎます。私のデータベースはOracleであり、Sql Serverではありません。

これらのセッション変数の値を保存する別の方法はありますか? 実際には、2 つのセッション変数を保持する必要があります。

これらの値を Oracle テーブルに格納することを考えていました。キーは SessionID です。他のセッション変数がリサイクルまたは失われた後でも、SessionID はその値を保持することを読みましたが、完全にはわかりません。

セッション変数がまだ存在するかどうかを確認するために、各ページの Page_Load mewthod に関数を配置することを計画していました。そうでない場合は、Oracle テーブルに移動して取得します。

何かのようなもの:

If Session("MyVariable") Is dbNull.Value Then
  Seek it on Oracle table, using SessionID as Key, and assign to variable Var
  Session("MyVariable") = Var
End If

大丈夫だと思いますか?SessionID を信頼できますか?

4

1 に答える 1

1

さて、頭に浮かぶ4つのセッションタイプがあります:

(1) インプロセスモード

このモードでは、セッション状態は現在のプロセスに保存され、このプロセスが終了すると、セッション状態に保存されたデータも失われます。このモードは、ASP.NET ではデフォルトで設定されています。以下に、web.config ファイルでそのような状態を構成する例を示します。

<configuration> <sessionstate mode="inproc" cookieless="false" timeout="30" sqlconnectionstring="data source=127.0.0.1;user id=user;password=pass" server="127.0.0.1" port="42424" />  

このセッション状態の最も重要なパラメーターは次のとおりです。

  • モード - このパラメーターには、inproc、sqlserver、stateserver の 3 つの値があります。この例の値 inproc は、セッション状態がインプロセス モードであることを示します。
  • cookieless - このパラメーターのブール値は、セッション状態が機能するために Cookie が必要かどうかを示します
  • タイムアウト - セッションが有効な時間を示します。ユーザーがアプリケーションと対話するたびに、タイムアウトは現在の時刻とタイムアウトの値に設定されます

このモードの最大の利点はパフォーマンスです。プロセス間のデータ転送がないため、大幅に高速化されます。

(2) アウトプロセスモード

このモードでは、セッションは別のプロセスに保存されるため、他のプロセスを終了してもセッション状態は維持されます。これは、アウト プロセス モードの web.config でのセッション状態のサンプル構成です。

<configuration> <sessionstate mode="stateserver" cookieless="false" timeout="30" sqlconnectionstring="data source=127.0.0.1;user id=user;password=pass" server="127.0.0.1" port="42424" />  

その下に、アウトプロセス モードでのセッション状態のパラメーターが表示されます。

  • mode - stateserver に設定された値は、アウトプロセス モードで動作することを示します
  • service - 状態サービスがあるサーバーを示します。この例では、localhost です。
  • port - ポート オブ ステート サービスを示します

前に述べたように、このモードの利点は、プロセスでセッション状態を失わないことですが、インプロセス モードよりもパフォーマンスが低下します。

(3) SQL Server モード

SQL サーバー モードでは、セッション状態は SQL サーバーに保存されます。構成するには、次のコードを web.config ファイルに追加する必要があります。

<configuration> <sessionstate mode="sqlserver" cookieless="false" timeout="30" sqlconnectionstring="data source=server_name;user id=user;password=pass" server="127.0.0.1" port="42424" />  

このモードで最も重要なパラメータは次のとおりです。

  • mode - sqlserver 値に設定すると、セッション状態が SQL サーバー モードで機能する必要があることを示します
  • sqlconnectionstring - サーバーの名前、SQL サーバーのユーザー名とパスワードを含む文字列が含まれています。

このモードの最大の利点は、セッション状態を失わないという信頼性ですが、欠点は、以前のモードよりも遅いことです。

(4) クッキーレス

このモードでは、クライアントのブラウザで Cookie を有効にする必要はありません。このモードは、セッションを識別する ID で URL アドレスを変更することによって機能します。構成は次のとおりです。

<configuration> <sessionstate mode="stateserver" cookieless="true" timeout="30" sqlconnectionstring="data source=127.0.0.1;user id=user;password=pass" server="127.0.0.1" port="42424" />  

このモードに不可欠なパラメーターは「cookieless」です。この例では true に設定されています。これは、状態を維持するために Cookie が必要ないことを意味します。このソリューションの利点はすでにご存じでしょう。Cookie は必要ありません。

提案:

何らかの理由でセッション値が失われている場合は、(2) アウトプロセス モードまたは (3) SQL Server モードを試してください。どちらのモードも、セッションの存続期間をより長く、永続的にするという利点があります。これらは通常、ユーザーの訪問中にセッションを維持する必要がある大規模な本番サイトで使用されます。前述の唯一の欠点はパフォーマンスです。小規模から中規模のアプリの場合、これはアプリケーションに大きな影響を与えません。

これで失われたセッションが元に戻ることはありませんが、セッションを維持するのに役立ちます。これが少なくとも少し役に立てば幸いです。

于 2012-10-12T19:29:57.557 に答える