2

私のアプリケーションでは、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秒以内にリクエストを行うと、別のユーザーのものであっても、キャッシュ内のそのページが返されます。

4

1 に答える 1

1

あなたはどのDBHandlerように見えますか?すべてのデータベース作業に対して 1 つの接続を何らかの方法で共有していますか (たとえば、接続が の静的メンバーであるなどDBHandler)?

ここに投稿したコードはおそらく問題ではありません。適切なロックを行わずに、意図せずにリクエスト間でリソースを共有する可能性が高くなります。

于 2012-04-09T12:00:42.093 に答える