2013-05-12 32 views
5

I InitializeSimpleMembershipAttribute in Filter Directory Erstellen verwendet ASP.NET-Standard MVC4 Web Application Template und Visual Studio und erstellen wie dieses Konto Controller:Warum Klassenattribut in WebAPI nicht funktioniert?

[Authorize] 
[InitializeSimpleMembership] 
public class AccountController : Controller 
{ 
/* Some Default Actions like Login, LogOff, Register, ...*/ 
} 

und ich versuche, Account WebAPI, meinen Code zu machen ist:

[Authorize] 
[InitializeSimpleMembership] 
public class APIAccountController : ApiController 
{ 
    [System.Web.Http.AcceptVerbs("GET", "POST")] 
    [System.Web.Http.HttpGet] 
    [System.Web.Http.HttpPost] 
    [System.Web.Http.AllowAnonymous] 
    [System.Web.Mvc.ValidateAntiForgeryToken] 
    public string Login(string UserName, string Password, bool RememberMe) 
    { 
     if (WebSecurity.Login(UserName, Password, persistCookie: RememberMe)) 
     { 
      return "OK"; 
     } 

     return "Failed"; 
    } 
} 

jetzt, wenn ich api nennen, seine Pause in dieser Zeile:

if (WebSecurity.Login (Benutzername, Passwort, per sistCookie: RememberMe))

und sagte: Sie müssen die "WebSecurity.InitializeDatabaseConnection" -Methode aufrufen, bevor Sie eine andere Methode der "WebSecurity" -Klasse aufrufen.

Ich lief es in InitializeSimpleMembershipAttribute und Webapi-Controller ist gleich mit Controller.

Warum Attribut nicht in WebAPI ausgeführt?

Antwort

4

Die [InitializeSimpleMembership] -Attribut erbt von System.Web.Mvc.ActionFilterAttribute

Aktionsfilter für Web-API müssen von System.Web.Http.Filters.ActionFilterAttribute erben, so dass die Filter nicht wirklich auf Ihren Web-API-Controller ausgeführt zu werden.

es zwei Dinge, die Sie tun können:

  • entweder Ihre eigenen Filter implementieren, abgeleitet von System.Web.Http.Filters.ActionFilterAttribute
  • Fügen Sie den folgenden Code in Ihre global.asax

    private static SimpleMembershipInitializer _initializer; 
    private static object _initializerLock = new object(); 
    private static bool _isInitialized; 
    
    protected void Application_Start() 
    { 
        // Ensure ASP.NET Simple Membership is initialized only once per app start 
    LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
    } 
    

Damit dies arbeiten Sie müssen die Logik von InitializeMembership in eine separate Klasse verschieben und machen sicher, dass Sie es von der global.asax zugreifen können.

Verwandte Themen