IIS (ASP.NET) でアプリケーションを実行していて、かなりの回数、ページが読み込まれますが、実際にページを要求したユーザーとは異なるユーザーの情報が表示され、取り込まれます。ページのレンダリングと入力に使用されるデータは、ほぼ同じ時点でリクエストを開始したユーザーのものです。
これは、静的変数と、スレッドの敏捷性と呼ばれるものが原因でしょうか?
これはスレッドの敏捷性の問題ではなく、静的変数の使用に関する問題です。静的変数は、1 つのスレッドではなく、PROCESS に対して静的です。したがって、ASP.NET の静的変数は、サイトに対して行われるすべての要求によって共有されます。この静的変数はすべてのリクエスタ間で共有されることを意味しているのか、それとも 1 つのリクエスタに固有のものなのかを自問してください。例えば:
static int TotalPageHits; //Count the number of times a page has been requested
明らかに、これはすべてのユーザーと共有するのに最適なデータです。一方で:
static string CurrentUserId; //DANGER WILL ROBINSON!!!!
HttpContext.Current.Items に入れたい 1 つのリクエスターに固有の変数。
ユーザー固有のデータを含む静的変数は、表示されている動作を説明します。
スレッドの敏捷性は問題を悪化させる可能性があります (たとえば、問題をより目立たせたり、問題のさまざまな症状を引き起こしたり、ThreadStaticの使用法で問題を引き起こしたりするなど)、静的メンバーの使用法を調べることから始めます。
// bad - any caller can access this in any sequence
public static int CurrentUserId
{
get;
set;
}
// okay, because the backing storage is safe/segmented
public static int CurrentUserId
{
get { return (int)Session["CurrentUserId"]; }
set { Session["CurrentUserId"] = value; }
}
// data that you want to be shared
public static List<string> SomeValuesToBeShared
{
// safe for reading (if properly initialized)
// safe for writing only if appropriate locks are used
}
コードが本当にスレッドセーフである場合、これは起こりません...
このようなコンテキストでの静的変数の使用は、調査の良い出発点になる可能性があります...
マークされたものを意味する場合ThreadStatic
、これも良い出発点です...
特定の方法で支援するには、より多くの詳細を提供する必要があります...