在我的应用程序中,当两个或多个用户登录时,如果他们同时(在确切时间)点击同一页面,那么其他人登录会更改一个人的登录名。我的页面加载事件的代码如下。
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 秒内发出请求,则即使它是另一个用户的,也会返回缓存中的页面。