2011-08-17 10 views
1

私はASP.net Webアプリケーションをデフォルトのアプリケーションプールで実行しています。ユーザーが、別のユーザーのために返された結果を取得したことを報告しました。私が知る限り、2つの異なるマシン上の2人のユーザーが互いの結果を見るべきではありません。ここでクロスアプリケーションインスタンスが漏れていますか?

は、内部構造がUser1とUser2が両方でほぼ同じ瞬間を上記のアプリケーションを使用していた

namespace SomeApplication 
{ 
public partial class _Default : System.Web.UI.Page 
{ 
    static ArrayList results = new ArrayList(); 

    protected void Button_Click(object sender, EventArgs e) 
    { 
     // Add data to results 
     // Display in asp:Table element 
    } 
    } 
} 

どのように見えるかを非常に大まかです。 User1は正常な結果を得ましたが、user2は結果が混在し、User1の結果はasp:Tableに表示されます。

今、私は結果オブジェクトはグローバルスコープであるが、それはインスタンスごとのアプリケーションオブジェクトのこのaは私の理解だった知っています。

答えて

2

静的変数は、現在実行中のASP.NETワーカープロセス内でグローバルである、ユーザー固有のものではありません。この1つのプロセスが両方のユーザーに役立つ可能性は全くあります。つまり、プロセス内で実行されているコードはこの静的変数を参照します。 Staticsも危険です。なぜなら、IISは任意の時点でワーカープロセスをリサイクルできるからです。これは変数の値をビンに入れます。

代わりにあなたがセッション状態のように、ASP.NETで提供状態/キャッシングメカニズムのいずれかを使用する必要がある場合があります

http://msdn.microsoft.com/en-us/library/ms972429.aspx

1

すでにアダムで指摘したように、静的変数は、ユーザ固有のものではありませんが、 AppDomainあたりです。ですから、1つのアプリ・プール内の複数のサイトを実行しているASP.NETのシナリオでは、各アプリケーションプールのプロセスは、(あなたがより多くのアプリケーションプールごとに1つのワーカー・プロセスよりも構成に基づいてすることができます)各Webアプリケーションのための1つのアプリドメインを持つことになります。したがって、すべてのユーザーが同じ静的変数を共有します。

だけでなく、そこに静的変数のために組み込まれて何のスレッドセイフティされず、2つの異なるスレッドがその変数にアクセスしているとき、あなたが実際に、一貫性のあるデータを見ることができるということ。

あなたが土地を選定している、あなたは(ASP.NETシナリオで)リクエストスコープごとに対応して、インスタンス変数を使用したほうが良いだろうということ例えば

が、(使用例フルフィル最も、あなたがする必要はありませんスレッドセーフであることを心配している)。繰り返されるポストバックで同じページに対して維持したいデータの場合は、ビューステートを使用します。より多くの人生の時間を持っているデータの場合、あなたは、アプリケーションの状態がそれらにアクセスする前にスロットをロックするための手段を提供しながら、スレッドセーフな実装はされている最初の2などApplication stateASP.NET CacheSession Stateの間で選択することができます。

あなたはASP.NETで利用可能なさまざまな状態管理オプションについては以下のリンクを参照してください。