tutorial net mvc español create asp c# asp.net-mvc asp.net-mvc-4 asp.net-membership

c# - español - asp.net mvc tutorial



Debe llamar al método "WebSecurity.InitializeDatabaseConnection" antes de llamar a cualquier otro método de la clase "WebSecurity" (6)

¿Por qué no simplemente crear el _AppStart.cshtml en la raíz del proyecto y colocar el código de inicialización como indica el mensaje de error?

@{WebMatrix.WebData.WebSecurity.InitializeDatabaseConnection("DefaultConnection", "TableName", "ColumnId", "ColumnName", autoCreateTables: false);}

Cada vez que reinicio la depuración con Visual Studio obtengo este maldito error:

Debe llamar al método "WebSecurity.InitializeDatabaseConnection" antes de llamar a cualquier otro método de la clase "WebSecurity". Esta llamada debe colocarse en un archivo _AppStart.cshtml en la raíz de su sitio.

Pero eso es todo el tiempo, y cuando despliego la aplicación para prod. Recibo este error aquí y luego, al azar.

Pongo la etiqueta adecuada:

[Authorize(Roles = "admin")] [InitializeSimpleMembership] public class IndexController : Controller

al controlador y aquí está el filtro como está. Simplemente no quiere funcionar.

using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Threading; using System.Web.Mvc; using MeetingTaskManagement.Models; using WebMatrix.WebData; namespace MeetingTaskManagement.Filters { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute { private static SimpleMembershipInitializer _initializer; private static object _initializerLock = new object(); private static bool _isInitialized; public override void OnActionExecuting(ActionExecutingContext filterContext) { // Ensure ASP.NET Simple Membership is initialized only once per app start LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); } private class SimpleMembershipInitializer { public SimpleMembershipInitializer() { Database.SetInitializer<UsersContext>(null); try { using (var context = new UsersContext()) { if (!context.Database.Exists()) { // Create the SimpleMembership database without Entity Framework migration schema ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); } } WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); } catch (Exception ex) { throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); } } } } }

alguien me puede ayudar a resolver esto?


El requisito es solo llamar a la conexión de base de datos de seguridad web, puede hacer lo siguiente que funciona:

var WebSecDBContx = new UsersContext(); var CreatedByUser = WebSecDBContx.UserProfiles.Find(UserID); string CreatedByUserName = CreatedByUser.UserName;


Elimine el atributo SimpleMemberShip de sus controladores y bórrelo. Agregue lo siguiente a su archivo global.asax.

private static SimpleMembershipInitializer _initializer; private static object _initializerLock = new object(); private static bool _isInitialized; protected void Application_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); } public class SimpleMembershipInitializer { public SimpleMembershipInitializer() { using (var context = new UsersContext()) context.UserProfiles.Find(1); if (!WebSecurity.Initialized) WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); } }


Estaba siendo inteligente usando un contexto único tanto para el proveedor de Membresía como para mis modelos de dominio. Resultó que ese era el problema; no puede usar el proveedor de Membresía y las clases de dominio en un solo contexto.

Necesitas tener dos contextos.


Para simplificar su Global.asax, puede poner el código para la inicialización en la class AuthConfig así:

public static class AuthConfig { private static SimpleMembershipInitializer _initializer; private static object _initializerLock = new object(); private static bool _isInitialized; public static void RegisterAuth() { // Ensure ASP.NET Simple Membership is initialized only once per app start LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); // To let users of this site log in using their accounts from other sites such as Microsoft, Facebook, and Twitter, // you must update this site. For more information visit http://go.microsoft.com/fwlink/?LinkID=252166 //OAuthWebSecurity.RegisterMicrosoftClient( // clientId: "", // clientSecret: ""); //OAuthWebSecurity.RegisterTwitterClient( // consumerKey: "", // consumerSecret: ""); //OAuthWebSecurity.RegisterFacebookClient( // appId: "", // appSecret: ""); //OAuthWebSecurity.RegisterGoogleClient(); } private class SimpleMembershipInitializer { public SimpleMembershipInitializer() { Database.SetInitializer<UsersContext>(null); try { using (var context = new UsersContext()) { if (!context.Database.Exists()) { // Create the SimpleMembership database without Entity Framework migration schema ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); } } WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); } catch (Exception ex) { throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); } } } }


Simplemente cambio el [InitializeSimpleMembership] a HomeController, y lo borro de AccountController. Debido a que las inicializaciones se hacen de una manera perezosa ... solo quiero apurarlo ... ¡y funcionó!