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 用于将值传递给 sqlDatasource 选择语句参数。aspUserId 也是我用来测试用户的 aspnet_UserID 的。我使用检查元素对其进行了测试。我发现它的值被其他用户的 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看起来像什么?您是否以某种方式为所有数据库工作共享一个连接(例如,该连接是 的静态成员DBHandler)?

您在此处发布的代码可能不是问题。您更有可能在没有适当锁定的情况下无意中在请求之间共享资源。

于 2012-04-09T12:00:42.093 回答