当前位置: 首页 > 编程语言 > C#

在调用“WebSecurity”类的任何其他方法之前,必须调用“WebSecurity.InitializeDatabaseConnection”方法分享

时间:2023-04-11 11:52:57 C#

C#学习教程:在调用“WebSecurity”类的任何其他方法之前,必须先调用“WebSecurity.InitializeDatabaseConnection”方法每次都被调用每次我重新启动使用VisualStudio进行调试时,我都会收到这个奇怪的错误:必须在调用“WebSecurity”类的任何其他方法之前调用“WebSecurity.InitializeDatabaseConnection”方法。此调用应放在站点根目录中的_AppStart.cshtml文件中。但这是每次,当我将应用程序部署到产品时。然后我在这里得到了这个错误。我放了正确的标签:[Authorize(Roles="admin")][InitializeSimpleMembership]publicclassIndexController:Controller到控制器,这是过滤的方式。它只是不想工作。使用系统;使用System.Data.Entity;使用System.Data.Entity.Infrastructure;使用系统线程;使用System.Web.Mvc;使用MeetingTaskManagement.Models;使用WebMatrix.WebData;命名空间MeetingTaskManagement.Filters{[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple=false,Inherited=true)]publicsealedclassInitializeSimpleMembershipAttribute:ActionFilterAttribute{privatestaticSimpleMembershipInitializer_initializer;私有静态对象_initializerLock=newobject();私人静态布尔_isInitialized;publicoverridevoidOnActionExecuting(ActionExecutingContextfilterContext){//确保ASP.NET简单成员资格在每次应用启动时只初始化一次LazyInitializer.EnsureInitialized(ref_initializer,ref_isInitialized,ref_initializerLock);}privateclassSimpleMembershipInitializer{publicSimpleMembershipInitializer(){Database.SetInitializer(null);尝试{使用(varcontext=newUsersContext()){if(!context.Database.Exists()){//创建没有EntityFramework迁移架构的SimpleMembership数据库((IObjectContextAdapter)context).ObjectContext.CreateDatabase();}}WebSecurity.InitializeDatabaseConnection("DefaultConnection","UserProfile","UserId","UserName",autoCreateTables:true);}catch(Exceptionex){thrownewInvalidOperationException("无法初始化ASP.NET简单成员数据库。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=256588",ex);}}}}}有人可以帮我弄这个吗?从控制器中删除SimpleMemberShip属性并将其删除将以下内容添加到global.asax。私有静态SimpleMembershipInitializer_initializer;私有静态对象_initializerLock=newobject();私人静态布尔_isInitialized;protectedvoidApplication_Start(){AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);AuthConfig.RegisterAuth();LazyInitializer.EnsureInitialized(ref_initializer,ref_isInitialized,ref_initializerLock);}publicclassSimpleMembershipInitializer{publicSimpleMembershipInitializer(){使用(varcontext=newUsersContext())context.UserProfiles.Find(1);如果(!WebSecurity.Initialized)WebSecurity.InitializeDatabaseConnection("DefaultConnection","UserProfile","UserId","UserName",autoCreateTables:true);}}要简化Global.asax,可以将初始化代码放入classAuthConfig如下所示:publicstaticclassAuthConfig{privatestaticSimpleMembershipInitializer_initializer;私有静态对象_initializerLock=newobject();私人静态布尔_isInitialized;publicstaticvoidRegisterAuth(){//确保ASP.NET简单成员资格在每次应用启动时只初始化一次LazyInitializer.EnsureInitialized(ref_initializer,ref_isInitialized,ref_initializerLock);//要让此站点的用户使用他们在其他站点(例如Microsoft、Facebook和Twitter)的帐户登录,//您必须更新此站点。有关详细信息,请访问http://go.microsoft.com/fwlink/?LinkID=252166//OAuthWebSecurity.RegisterMicrosoftClient(//clientId:"",//clientSecret:"");//OAuthWebSecurity.RegisterTwitterClient(//consumerKey:"",//consumerSecret:"");//OAuthWebSecurity.RegisterFacebookClient(//appId:"",//appSecret:"");//OAuthWebSecurity.RegisterGoogleClient();}privateclassSimpleMembershipInitializer{publicSimpleMembershipInitializer(){Database.SetInitializer(空);try{using(varcontext=newUsersContext()){if(!context.Database.Exists()){//创建没有EntityFramework迁移架构的SimpleMembership数据库((IObjectContextAdapter)context).ObjectContext。创建数据库();}}WebSecurity.InitializeDatabaseConnection("DefaultConnection","UserProfile","UserId","UserName",autoCreateTables:true);}catch(Exceptionex){thrownewInvalidOperationException("无法初始化ASP.NET简单成员数据库。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=256588",ex);我刚刚将[InitializeSimpleMembership]切换到HomeController,并从AccountController中删除了它,因为初始化是以一种懒惰的方式完成的。我只是想快点......它起作用了!通过为会员提供者和我的域模型使用单一上下文,我成为了一个聪明人。事实证明这就是问题所在;您不能在单个上下文中使用成员资格提供程序和域类。你需要有两个上下文。需求只是调用WebSecurityDatabaseConnection,可以做如下工作:varWebSecDBContx=newUsersContext();varCreatedByUser=WebSecDBContx.UserProfiles.Find(UserID);字符串CreatedByUserName=CreatedByUser.UserName;为什么不在项目根目录中创建_AppStart。cshtml,并将初始化代码放在那里,如错误消息所示。以上是C#学习教程:在调用“WebSecurity”类的任何其他方法之前,必须先调用“WebSecurity.InitializeDatabaseConnection”方法,共享所有内容。关注—@{WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DefaultConnection","TableName","ColumnId","ColumnName",autoCreateTables:false);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: