2013-04-01 21 views
38

Obecnie za każdym razem, gdy próbuję zarejestrować użytkownika lub login przy użyciu domyślnych usług członkostwa wbudowanych w ASP.Net MVC4 na moim dostawcy hosta DiscountASP I Otrzymaj błądAby wywołać tę metodę, właściwość "Membership.Provider" musi być instancją "ExtendedMembershipProvider"

To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider".

To nie dzieje się lokalnie.

Oto moja InitializeSimpleMembershipAttribute.cs:

[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 abstract class SimpleMembershipInitializer 
    { 
     protected 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); 
      } 
     } 
    } 
} 

Oto pełny zrzut ekranu z błędem:

Czy ktoś wie jak mogę rozwiązać ten problem lub wie artykuł, który rozwiązuje go?

+1

można pokazać '' część web.config? Wygląda na to, że próbujesz użyć SimpleMembership, ale dostawca nie pasuje. Upewnij się również, że 'WebMatrix. *' Jest ustawione na 'Kopiuj Local = True' pod właściwościami referencji. –

+0

Właściwie nie mam sekcji członkostwa zdefiniowanej w moim Web.config z jakiegoś powodu. Czy możesz dać mi znać, jak powinien wyglądać? –

Odpowiedz

63

Spróbuj ustawić następujące w swojej web.config obrębie węzła <system.web>:

<roleManager enabled="true" defaultProvider="SimpleRoleProvider"> 
     <providers> 
      <clear /> 
      <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" /> 
     </providers> 
    </roleManager> 
    <membership defaultProvider="SimpleMembershipProvider"> 
     <providers> 
      <clear /> 
      <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" /> 
     </providers> 
    </membership> 
    <sessionState mode="InProc" customProvider="DefaultSessionProvider"> 
     <providers> 
      <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" /> 
     </providers> 
    </sessionState> 

Brzmi jak SimpleMembership nie jest rozpoznawane, gdy idziesz do niej korzystać.

Ponadto, może warto w tym biblioteka WebMatrix.webData można zainstalować poprzez Nuget:

PM> Install-Package Microsoft.AspNet.WebPages.WebData 
+0

Dzięki temu działało świetnie! –

+0

Cieszę się, że mogę Ci pomóc! ;-) –

+0

W czwartym wierszu twojego kodu mam błąd serwera: "Nie można załadować pliku lub zestawu" WebMatrix.WebData "lub jednej z jego zależności.Nie system nie może znaleźć określonego pliku." Co może być przyczyną? – pt12lol

1

Miałem ten sam błąd, ale to było 100% odniesienia dla mnie. Miałem problemy z kilkakrotnym uruchomieniem WebMatrix.WebSecurity ... za każdym razem dlatego, że nie utworzyłem projektu przy użyciu szablonu internetowego MVC 4.

Kluczem jest to, że referencje i konfiguracja działają domyślnie w szablonie, więc po prostu odtwórz projekt i wszystko będzie dobrze.

Moja poprawka to: 1. Utwórz kopię zapasową mojego projektu w innym folderze. 2. Sprawdź wszystkie pliki 3. Utwórz nowy projekt internetowy MVC 4, pod dokładnie taką samą nazwą. 4. Kopiuj + wklej (zastąp) oryginalny projekt. 5. Dodaj brakujące odniesienia, zmienione trasy, ustawienia .config/połączenia DB.

+0

Co to znaczy "szablon internetowy"? Szablon projektu mvc 4 w visual studio domyślnie nie działa? –

+0

Och, myślę, że chcesz wybrać lokalny szablon projektu ASP.NET MVC 4, a następnie na następnym ekranie wybierz "Aplikacja internetowa". Czy mam rację? Chciałem tylko wyjaśnić, ponieważ początkowo myślałem, że znalazłeś internetowy szablon projektu dla mvc i zainstalowałeś go. –

3

Wykonano powyższe czynności, ale to nie pomogło. Co pomogło zmieniał web.config:

 <dependentAssembly> 
    <assemblyIdentity name="WebMatrix.Data" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.0.0.0" /> 
    </dependentAssembly> 
      <dependentAssembly> 
    <assemblyIdentity name="WebMatrix.WebData" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.0.0.0" /> 
    </dependentAssembly> 
6

Spróbuj zmienić funkcję logowania pod AccountController.cs

 // 
    // POST: /Account/Login 

    [AllowAnonymous] 
    [HttpPost] 
    public ActionResult Login(LoginModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 
       if (Url.IsLocalUrl(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       else 
       { 
        return RedirectToAction("Index", "Home"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     return View(model); 
    } 
+0

dzięki bro, jego prace – yozawiratama

+0

Prawidłowo! Jest to świetna poprawka dla każdego, kto przenosi się ze stron aspx do MVC! – TomO

Powiązane problemy