私のアプリケーションでは、2人以上のユーザーがログインし、同じページを同時に(正確な時間に)クリックすると、自分のログインが他のユーザーのログインによって変更されます。ページ読み込みイベントのコードは次のとおりです。
MembershipUser mUser = Membership.GetUser();
if (mUser != null)
{
aspUserId.Value = mUser.ProviderUserKey.ToString();
DBHandler dbHandler = new DBHandler();
SqlCommand cmd = new SqlCommand();
cmd.Parameters.AddWithValue("@AspNetUserID", mUser.ProviderUserKey);
string sPMSUserId = dbHandler.GetSingleValue(cmd, "get_PMSUserId");
hdnUserID.Value = sPMSUserId;
}
else
{
Response.Redirect("~/index.aspx");
}
hdnUserIDは、sqlDatasourceselectステートメントパラメーターに値を渡すために使用されます。aspUserIdは、ユーザーのaspnet_UserIDをテストするためにも使用されます。inspect要素を使用してテストしました。値が他のユーザーのaspnet_UserIDによって変更されていることがわかりました。
DBHandlerでは、接続文字列を次のように使用しました
string strconn = ConfigurationManager.ConnectionStrings["strconn"].ConnectionString;
そのようなコードで
public string GetSingleValue(SqlCommand sqlcmdWithParameters, string CommandText)
{
string sReturn = "";
SqlConnection sqlcon = new SqlConnection(strconn);
sqlcmdWithParameters.Connection = sqlcon;
sqlcmdWithParameters.CommandType = CommandType.StoredProcedure;
sqlcmdWithParameters.CommandText = CommandText;
try
{
sqlcon.Open();
sReturn = Convert.ToString(sqlcmdWithParameters.ExecuteScalar());
}
catch (Exception ex)
{
sReturn = "-1";
}
finally
{
sqlcon.Close();
}
return sReturn;
}
ついに問題の原因がわかりました。ええ、それはキャッシュによるものです
.aspxページで、OutputCacheのディレクティブを次のように取得します
<%@ OutputCache Duration ="1" NoStore ="true" VaryByParam ="*" %>
これにより、ページが1秒間キャッシュされたままになります。別のページが1秒以内にリクエストを行うと、別のユーザーのものであっても、キャッシュ内のそのページが返されます。