存储UserProfile信息和防止每次页面加载时调用数据库的好方法

本文关键字:调用 加载 数据库 方法 信息 UserProfile 存储 | 更新日期: 2023-09-27 17:53:16

我试图创建一种方法来存储用户的个人资料信息在会话或缓存,并能够有该信息在手每次页面加载,以防止调用数据库每次我们加载一个页面。我希望能够把一些这些值在共享布局(所以我可以把用户的名字在右上角等)。在我的主页布局的顶部,我有以下内容:

@{  
    Domain.Entities.UserProfile user = (Domain.Entities.UserProfile)HttpContext.Current.Session[Membership.GetUser().ProviderUserKey.ToString()]; 
}

我在我的主页中使用user.FirstName这样的值。当用户登录时,我设置会话。有更好的方法吗?如果我注销,我只是导航到一个成员只有页面,[Authorize]过滤器被绕过,我得到一个错误Object reference not set to an instance of an object.,因为我的用户配置文件还没有存储在会话中。我不会在会话中存储任何敏感信息,如UserId或任何东西,只是用户名,个人资料图像url等。我觉得也许有更好的方法来做这件事。

存储UserProfile信息和防止每次页面加载时调用数据库的好方法

可以将用户信息存储在身份验证cookie中。请记住,cookie将随着每个请求从客户端来回发送。所以如果有很多信息要存储,那可能不是正确的方式。

查看本文档的步骤4,该步骤解释了如何在cookie中存储额外的用户数据http://www.asp.net/web-forms/tutorials/security/introduction/forms-authentication-configuration-and-advanced-topics-cs

然后在你的主页上,你可以这样写

@{  
if (User.Identity.IsAuthenticated)
{
    //Your code goes here, no way user data is null.
}

您可以创建一个静态类作为接口来获取用户属性,这些属性将存储在会话状态中。

public class UserData{
    public static Domain.Entities.UserProfile GetUser(){
        string username;
        try{
            username = Membership.GetUser().ProviderUserKey.ToString();
        }catch(Exception e){
            //  just in case
            throw new AuthenticationException("The user isn't authenticated!");
        }
        var user = HttpContext.Current.Session[username] as Domain.Entities.UserProfile;
        if(user == null){
            user = //   get data from database
            HttpContext.Current.Session[username] = user;
        }
        return user;
    }
}

然后,在你的方法中你可以这样使用它:

if (User.Identity.IsAuthenticated)
{
    UserProfile user = UserData.GetUser();
    //Your code goes here, no way user data is null.
}

或者在控制器中:

[Authorize]
public ActionResult Index(){
    UserProfile user = UserData.GetUser();
    return //stuff
}

注意:我做这个没有能够测试,但我希望你能明白:)