我在应用程序中设置了一个自定义成员资格和角色提供程序。在ASP .Net Webforms中,我使用相同的提供程序,并且在编译和运行应用程序时,由于web.config中的引用而初始化提供程序。
当我将它移到MVC中,并将断点放在这些类的"Initialize“方法中时,就不会发生中断。
一个奇怪的问题是:如果我在控制器中使用“GetRolesForUser(Roles= "MYROLE")”进程并按下该操作,那么它就会被释放到Roleprovider,自动调用"GetRolesForUser“,但仍然不会命中初始化。这是一个问题,因为我需要在调用任何方法之前设置某些变量。
我知道我可以直接调用"Initialize“,但是我会认为这是自动完成的,就像在ASP Webforms中一样。
我是否必须在MVC中手动初始化这些内容,还是遗漏了什么?
发布于 2011-07-13 03:49:01
需要考虑的几点是,首先成员和角色提供者是静态的,通常只有在应用程序中第一次访问它们时才初始化它们。当在Web.Config中正确设置时,当第一次访问它们时,它们将调用初始化。
通过使用一组基本提供者和默认的ASP.NET MVC 2应用程序进行一些测试,我发现RoleProvider通常在应用程序启动时立即初始化。但是,需要注意的是,如果您希望重新初始化提供程序,则必须停止开发web服务器(或iis express,或清除应用程序池)。这样,应用程序就会重新启动。如果没有,并且已经初始化了提供程序,那么它将永远不会到达那些断点,因为它已经运行了。
此外,当获得成员资格提供程序的实例时,不要通过创建类的新实例(例如var provider =新的MyMembershipProvider())来实现,因为这不会调用初始化方法。确保通过Membership.Provider获得您的提供程序,它将处理您正确配置的web.config提供程序的所有设置。
仔细查看AccountModels文件中的默认MVC 2应用程序(~第101行)提供了一个很好的示例。
_provider = provider ?? Membership.Provider;第一次访问它时,它将实例化默认的成员资格提供程序并调用初始化。在此之后,它将保持对应用程序的静态状态,并且在从内存中卸载应用程序之前不会再次调用。即。停止vs web开发服务器。
另外,获取特定成员资格提供程序的另一种类似方法也可以在以下站点找到:How do I call Initialize on a custom MembershipProvider?。
希望这会有所帮助:)
发布于 2009-12-08 17:30:26
Jay,我认为它们的工作方式与角色/成员资格提供者在ASP.NET WebForms中的工作方式相同。
您应该尝试的一件事是创建自定义的授权过滤器来调用您的应用程序方法,如下所示:
public class MyAuthorizeAttribute: FilterAttribute, IAuthorizationFilter
{
public string Role { get; set; }
#region IAuthorizationFilter Members
public void OnAuthorization(AuthorizationContext filterContext)
{
// add your logic here like
// var userRoles = MyCustomProvider.GetRolesForUser(filterContext.HttpContext.User.Identity);
// if(!userRoles.Contains(Role))
// .....
}
#endregion
}然后在您的操作中使用[MyAuthorize(Role = "MYROLE")]。
https://stackoverflow.com/questions/1867598
复制相似问题