2

当用户登录我的网站时,我想缓存一些数据,如电子邮件、确认状态、移动确认状态等。因为我不想在每个页面请求中获取这些数据。要求是用户在做任何事情之前必须确认电子邮件和手机。
我正在使用这样的代码:

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所有页面类都从它驱动的类。我CachedData在课堂上使用PageBase类:

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);
        }
    }
}

可能很奇怪,但此代码有时会出错并重定向到用户确认的电子邮件和移动设备的设置页面。
有没有更好的解决方案。

4

2 回答 2

1

我认为,如果这是您的逻辑,您应该创建一个 object UserInfo。像这样的东西:

public class UserInfo
{
    public string Name {get; set; }
    public bool IsEmailConfirmed {get; set; }
    public bool IsMobileConfirmed {get; set; }
    ....
} 

然后将此对象设置为会话。现在!当您在 BLL 中对用户记录执行任何操作时,您应该重新填充新的实例UserInfo并替换会话中的旧实例。这样,您的用户信息将是最新的并且将始终有效。

但是您的问题可能来自您使用网络场并且您的会话不同步的事实。您需要使用粘性会话,以便来自唯一用户的每个请求都在同一台服务器上处理。现在有个东西叫App Fabric。它正在类固醇上进行缓存。它可以在另一台服务器的缓存中找到一个项目。

于 2013-10-07T01:28:51.473 回答
0

您不应将对象的不同字段存储在不同的会话名称中。如果确实需要使用会话,可以将整个用户对象存储在会话中。

选择将数据存储在何处取决于需求(包括数据的关键程度以及诸如 IIS 重置之类的需求)以及您真正必须存储的内容和原因。根据答案,您可以将数据存储在会话中、视图状态中、缓存中或应用程序中。您还可以查看缓存,因为它提供了一些不错的功能,例如自动更新、触发等。

于 2013-10-08T13:47:35.497 回答