1

共有ホスティング システムに ASP.Net 4.0 Web サイトがあります。アプリケーションは、非アクティブ状態が 20 分間続くとリサイクルされます。

私のアプリケーションでは、いくつかの静的変数が application_start で初期化されます。

次のリクエストが届いたら、アプリケーションを再起動し、application_start を実行して、静的変数をリセットする必要があります。

非アクティブな期間の後、静的変数に依存するページにアクセスすると、それらは null になり、エラーが発生します。

これらの変数は application_start で初期化されるため、アプリケーションの再起動によって変数が再初期化されるため、非アクティブな期間が経過すると変数が null になるのは奇妙に思えます。

実際、null 参照エラーが表示された場合、アプリケーション プールをリサイクルする (および application_start を実行する) ことで、次にアプリケーションがメモリから削除されるまで問題が解決されます。

アプリケーションがメモリから削除されたときに、他のタイプのシステムメモリの問題が発生しているのではないかと思っています. null になります。

静的変数はガベージ コレクトされないため、初期化後に null になることはありません。

エラーは、共有ホスティング システムでのみ発生し、開発者のマシンでは発生しません。application_start で初期化された静的変数が null になる他の原因は何ですか?

変数をリセットするコードはありません。これらは、get メソッドを介したアクセスのみを含むプライベート フィールドです。

コード:

private static List<State> stateList;

public static void LoadStaticCache()
{
    var service = DependencyResolver.Current.GetService<ILocationService>();
    stateList = service.GetAllStates().ToList();
}

public static List<State> GetStates()
{
   return stateList;
}

非アクティブ期間が満たされると、stateList が次にアクセスされたときに null になります。

ただし、常に application_start で初期化されます。システムの問題でない限り、どうすればnullになることができますか?

    protected void Application_Start()
    {
        StaticCache.LoadStaticCache();
    }

アプリケーション プールをリサイクルすると、問題は 100% 解決されます。

4

1 に答える 1

1

あなたの問題はセッション タイムアウトに関連しているようです。

以前のバージョンの IIS とは異なり、ホストされたサーバーが統合モードで IIS 7.0 以降を実行している場合、Application_Start は現在の HTTP コンテキストがまだ存在しないため、アクセスできません。クラシック モードの IIS 7.0 には問題はありません。

いずれの場合も、解決策は、初期化を Global.asax の Session_Start に移動することです。

//protected void Application_Start()
//{
//    StaticCache.LoadStaticCache();
//}

protected void Session_Start(object sender, EventArgs e) 
{
    StaticCache.LoadStaticCache();
}
于 2012-04-10T16:12:21.020 に答える