3

.net Web アプリでは、静的変数の動作を変更する .aspx ページと c# コード ビハインド ページについて特別なことがあります。

他の場所で開発された多数のアプリケーション ページがあり、インスタンス変数であると思われるものが静的変数として宣言されている共通のパターンが実行されています。

質問のより詳細なステートメントは次のようになります。同じアプリケーション プール内の同じ iis サーバーで実行されている 2 つの Web セッション a と b がある場合、a が問題のページにアクセスし、静的変数 x を値 1 に設定し、次に b が同じページで静的変数 x を値 2 に設定すると、値 1 が値 2 に置き換えられたと理解しています。私のジレンマは、このパターンがコード内で繰り返し使用されていることです。結論は、それは運 (セッション a のタイミングで、セッション b がヒットする前に変数の必要性を放棄した) か、何か他のことが起こっているということです。

これがac#ニュアンスなのか開発者のバグなのか、提案をお待ちしています。

4

1 に答える 1

3

静的プロパティ/フィールドは、アプリ プールのリサイクル時など、いつでも消える可能性がある共有データに使用される限り、Web アプリケーションでは問題ありません。

とはいえ、それらの値は、.NET のような分離されたバッキング メカニズムがない限り、ASP.Net アプリケーション内で実際に共有されますSession

public static int UserId = 10; // BAD! everyone gets/sets this field's value

// BAD! everyone gets/sets this property's implicit backing value
public static int UserId {
     get;
     set;
}

// This case is fine; just a shortcut to avoid instantiating an object.
// The backing value is segregated by other means, in this case, Session.
public static int UserId{
    get{
        return (int)HttpContext.Current.Session["UserId"];
    }
}

// While I would question doing work inside a property getter, the fact that 
// it is  static won't cause an issue; every call retrieves data from a 
// database, not from a single memory location.
public static int UserId{
    get{
        // return some value from database
    }
}

トラフィックが大幅に増加するまで、問題が発生しない場合があります。ページが値を取得し、それを静的変数に入れ、一度使用してから実行を完了するとします。ページがすばやく実行される場合、タイミングが適切であるかトラフィックが十分に多い場合を除き、非常に小さな (しかし危険な!) オーバーラップ ウィンドウしか表示されない可能性があります。

これにより、診断が困難なバグが発生する可能性があります。バグはタイミングに依存しており、ローカル マシンで自分でテストした場合はおそらくバグが表示されないためです。

于 2012-07-31T11:01:57.317 に答える