在 asp.net 中缓存用户数据的最佳实践是什么?
本文关键字:最佳 是什么 数据 用户数 net asp 缓存 用户 | 更新日期: 2023-09-27 18:34:19
当用户登录我的网站时,我想缓存一些数据,如电子邮件、确认状态、移动确认状态等。因为我不想在每个页面请求中获取这些数据。要求是用户在执行任何操作之前必须确认电子邮件和移动设备。
我正在使用这样的代码:
public static class CachedData
{
public static bool IsEmailConfirmed
{
get
{
if (HttpContext.Current.Session["IsEmailConfirmed"] == null)
Initialize();
return Convert.ToBoolean(HttpContext.Current.Session["IsEmailConfirmed"]);
}
set
{
HttpContext.Current.Session["IsEmailConfirmed"] = value;
}
}
public static bool IsMobileConfirmed
{
get
{
if (HttpContext.Current.Session["IsMobileConfirmed"] == null)
Initialize();
return Convert.ToBoolean(HttpContext.Current.Session["IsMobileConfirmed"]);
}
set
{
HttpContext.Current.Session["IsMobileConfirmed"] = value;
}
}
public static void Initialize()
{
UserAccount currentUser = UserAccount.GetUser();
if (currentUser == null)
return;
IsEmailConfirmed = currentUser.EmailConfirmed;
IsMobileConfirmed = currentUser.MobileConfirmed;
}
}
我有PageBase
所有页面类都从它驱动。我在PageBase
类中使用类CachedData
:
public class PageBase : Page
{
protected override void OnInit(EventArgs e)
{
if (authentication.Required && User.Identity.IsAuthenticated && !IsPostBack)
{
if (CachedData.HasProfile && (!CachedData.IsEmailConfirmed || !CachedData.IsMobileConfirmed) && !Request.Url.AbsolutePath.ToLower().EndsWith("settings.aspx"))
Response.Redirect("/settings-page", true);
}
}
}
可能很奇怪,但是此代码有时会出错并重定向到用户确认电子邮件和移动设备的设置页面。
有没有更好的解决方案。
我认为
,如果这是你的逻辑,你应该创建一个对象UserInfo
.像这样:
public class UserInfo
{
public string Name {get; set; }
public bool IsEmailConfirmed {get; set; }
public bool IsMobileConfirmed {get; set; }
....
}
然后将此对象设置为会话。现在!在 BLL 中对用户记录执行任何操作时,应重新填充新的UserInfo
实例并替换会话中的旧实例。这样,您的用户信息将保持最新状态,并且始终有效。
但是,您的问题可能来自您使用 Web 场并且会话未同步的事实。您需要使用粘性会话,以便在同一台服务器上处理来自唯一用户的每个请求。现在有一种东西叫做App Fabric
.它缓存在类固醇上。它可以在另一台服务器上的缓存中找到项目。
不应将
对象的不同字段存储在不同的会话名称中。如果确实需要使用会话,则可以在会话中存储整个用户对象。
数据存储位置的选择取决于要求(包括数据的重要性和 IIS 重置等要求)以及您真正必须存储的内容和原因。根据答案,您可以将数据存储在会话、视图状态、缓存或应用程序中。您还可以查看缓存,因为它提供了一些不错的功能,例如自动更新,触发等。