小编Jer*_*ald的帖子

使用ASP .NET Membership和Profile with MVC,如何创建用户并将其设置为HttpContext.Current.User?

我在代码中实现了一个自定义的Profile对象,如Joel所述:

如何分配配置文件值?

但是,当我创建一个新用户时,我无法让它工作.当我这样做:

Membership.CreateUser(userName, password);
Roles.AddUserToRole(userName, "MyRole");
Run Code Online (Sandbox Code Playgroud)

用户是创建并添加到数据库中的角色,但HttpContext.Current.User仍然是空的,并Membership.GetUser()返回null,所以这(从Joel的代码)不起作用:

static public AccountProfile CurrentUser
{
    get { return (AccountProfile)
                     (ProfileBase.Create(Membership.GetUser().UserName)); }
}

AccountProfile.CurrentUser.FullName = "Snoopy";
Run Code Online (Sandbox Code Playgroud)

我尝试过这样调用Membership.GetUser(userName)和设置Profile属性,但是set属性保持为空,并且调用AccountProfile.CurrentUser(userName).Save()不会在数据库中放置任何内容.我也试着指示用户是有效的和登录,通过调用Membership.ValidateUser,FormsAuthentication.SetAuthCookie等等,但是当前用户仍然是空的或匿名的(根据我的浏览器的cookie的状态).

解决(进一步编辑,见下文):根据Franci Penov的解释和一些更多实验,我找出了问题.Joel的代码和我尝试的变体只适用于现有的个人资料.如果不存在Profile,ProfileBase.Create(userName)则每次调用时都会返回一个新的空对象; 您可以设置属性,但它们不会"粘住",因为每次访问时都会返回一个新实例.设置HttpContext.Current.User一个新的GenericPrincipal 将会给你一个User对象,但没有一个Profile对象,ProfileBase.Create(userName)并且HttpContext.Current.Profile仍将指向新的,空的对象.

如果要在同一请求中为新创建的用户创建配置文件,则需要调用HttpContext.Current.Profile.Initialize(userName, true).然后,您可以填充初始化的配置文件并保存它,并且可以在将来的请求中按名称访问它,因此Joel的代码将起作用.我只在HttpContext.Current.Profile内部使用,当我需要在创建时立即创建/访问配置文件.在任何其他请求,我使用ProfileBase.Create(userName),并且我只公开该版本.

请注意,Franci是正确的:如果您愿意创建用户(和角色)并在第一次往返时将其设置为Authenticated,并要求用户再登录,您将能够更简单地访问该配置文件通过Joel的代码来处理后续请求.让我感到震惊的是,Roles可以在用户创建时立即访问,无需任何初始化,但Profile不是.

我的新AccountProfile代码:

public static AccountProfile CurrentUser
{
    get
    {
        if (Membership.GetUser() != null)
            return ProfileBase.Create(Membership.GetUser().UserName) as …
Run Code Online (Sandbox Code Playgroud)

membership profile asp.net-mvc createuser

17
推荐指数
1
解决办法
1万
查看次数

在C#dll中缓存数据的最佳方法是什么?

我编写了一个可以以多种方式使用的DLL(由ASP.NET网站,WinForms等引用).它需要从几个定界文件加载其数据,这些文件将在半定期的基础上自动更新.出于性能原因,我将数据加载到静态对象(通用列表)中,并且只想在数据更改时返回到文件.(数据量不占用不合理的内存量,但每次访问时从文件中读取确实需要很长时间).我尝试过使用FileSystemWatcher,但事实证明它不可靠 - 它会定期错过文件更新.由于我不能指望在网站内运行的DLL,因此ASP.NET CacheDependency选项似乎不合适.有没有人找到这种方法的好方法?

.net dll dependencies caching file

7
推荐指数
2
解决办法
8399
查看次数