1

いくつかの .aspx ページを含むプロセスがあります。1 つに情報を入力し、それにハングアップし、iframe がある別のページに移動し、iframe 内のドキュメントを Web サービス経由でサーバーにアップロードし、ドキュメントのリストとアップロードのステータスを保持します。次に、3 ページ目で、すべてのデータをデータベースに保存することを含む別の操作を行います。

ページ 1 からページ 2 に移動する前に、いくつかのデータをセッション変数に入れました。2 ページ目では、データが取得されて表示されます。2 ページ目の iframe 内のページ内からファイルをアップロードするプロセス中に、さらにいくつかのデータがセッション変数に入れられます。次に、3 ページ目でデータがセッションから取得され、次の場所に書き込まれます。データベース。

テストサーバーでは、これはすべて完全に機能します。稼働中のサーバーで、(ランダムに) 「オブジェクトが参照に設定されていません」というエラーが発生し続けます。これは、セッション変数が消えたことを報告しているようです。

私の理解では、.aspx ページ内で ...

HttpContext.Current.Session["myvariable"]
Session["myvariable"]

事実上、同じものです。を使用してセッション変数を設定しています...

Session["Variable1"] = "fred";

セッション変数が失われているように見える理由(ランダムに、ライブサーバーでプロセスが正常に動作することがあります)のアイデアはありますか?

これは、Web アプリケーションではなく Web サイトです。Framework 4.0 を使用して VS2010 で開発

4

4 に答える 4

1

セッションが失われる理由はさまざまです。

それらのいくつかは次のとおりです。

  1. sessionState タイムアウトの期限が切れました
  2. アプリケーション ドメインがフォルダー App_Data 内のファイルのようにリサイクルする原因となる web.config またはその他のファイルの種類を更新します。
  3. アプリケーション プールがリサイクルされる
  4. 物理的にコピー アンド ペーストするだけで大​​量のファイルを使用してサイトを更新すると、ASP.NET によってセッションが自動的にリサイクルされます。

理由がわからない場合は、アプリケーション プールがリサイクルされている理由をイベント ログに記録できます。原因がわかって、それに応じて予防策を講じることができるかもしれません。

ロギングの場合、Application_End に次のコード ブロックを記述できます。

public void Application_End()
{
    HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime",   BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null, CultureInfo.InvariantCulture);

    if (runtime == null)
        return;

    string shutDownMessage = (string)runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null, CultureInfo.InvariantCulture);

    string shutDownStack = (string)runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null, CultureInfo.InvariantCulture);

    //Do Logging as per your need and implementation      
    //Logging.Write(TraceEventType.Error, shutDownMessage, shutDownStack);
}
于 2013-07-30T06:51:24.713 に答える
1

シリアル化できないオブジェクトをセッション変数に保存し、実稼働サーバーでセッションをプロセス外に保つのは良い可能性です (負荷分散?)。オブジェクトがシリアライズ可能かどうかを確認し、そうでない場合はシリアライズ可能にします。

于 2013-07-30T08:17:21.677 に答える
0

セッションがその価値を失う可能性があるもう 1 つの条件があります。

Fiddler ツールを使用して、この問題を追跡できます。

ほとんどの条件は、ソースのような要素がソリューションに見つからない場合に見つかります。その時点で、サーバーはプロジェクトを再起動して、根拠のないオブジェクトまたは失われたオブジェクトをリロードしようとします。プロジェクトを再起動すると、すべてのセッション オブジェクトがリセットされます。

ありがとう。

于 2014-10-09T09:55:38.410 に答える
0

何が起こるかというと、ライブ サーバーがそのアプリケーション プールをリサイクルしているということです。これにより、基本的にアプリケーションに使用されるメモリがリセットされます。通常はタイムアウトを設定できますが、アプリケーション プールがリサイクルされると、セッションがリセットされます。

解決策は、セッション状態に SQL サーバーを使用することです。

これを試してください: http://support.microsoft.com/kb/317604

補足リンク: http://www.codeproject.com/Articles/104082/Configuring-ASP-session-state-on-SQL-server

web.config大規模なパブリック ホストでホスティングしている場合、おそらくセッション状態を処理するために SQL が既に準備されているため、 SQL セッション状態を使用するようにファイルを変更するだけでよいはずです。

チャオ

于 2013-07-30T06:46:08.300 に答える