Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net中缓存用户数据的最佳实践是什么_C#_Asp.net_Caching_Session Variables - Fatal编程技术网

C# 在asp.net中缓存用户数据的最佳实践是什么

C# 在asp.net中缓存用户数据的最佳实践是什么,c#,asp.net,caching,session-variables,C#,Asp.net,Caching,Session Variables,当用户登录到我的网站时,我希望缓存一些数据,如电子邮件、确认状态、移动确认状态等,因为我不希望在每个页面请求中获取这些数据。要求用户在做任何事情之前必须确认电子邮件和手机。 我使用的代码如下: public static class CachedData { public static bool IsEmailConfirmed { get { if (HttpContext.Current.Session["IsEmail

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

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
class:
中使用class
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场并且您的会话不同步的事实。您需要使用粘性会话,以便在同一服务器上处理来自唯一用户的每个请求。现在有一种东西叫做
appfabric
。它正在服用类固醇。它可以在另一台服务器的缓存中找到项目

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

选择在何处存储数据取决于需求(包括数据的重要性以及IIS重置等方面的需求),以及您真正需要存储的内容和原因。 根据答案,您可以将数据存储在会话、viewstate、缓存或应用程序中。 您还可以查看缓存,因为它提供了一些很好的功能,如自动更新、触发等