2013-05-12 59 views
5

我用默認的ASP.NET MVC4 Web應用程序模板和Visual Studio中的過濾器目錄創建InitializeSimpleMembershipAttribute和創建賬戶控制器是這樣的:爲什麼class屬性在WebAPI中不起作用?

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

,我儘量讓的AccountController的WebAPI,我的代碼是:

[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"; 
    } 
} 

現在,當我打電話的API,它在這個換行符:

如果(WebSecurity.Login(用戶名,密碼,每sistCookie:RememberMe))

並且說:在調用「WebSecurity」類的任何其他方法之前,您必須調用「WebSecurity.InitializeDatabaseConnection」方法。

我運行它在InitializeSimpleMembershipAttribute和webapi控制器是相同的控制器。

爲什麼屬性不能在WebAPI中運行?

回答

4

System.Web.Mvc.ActionFilterAttribute

的Web API措施篩選器[InitializeSimpleMembership] -attribute繼承需要從System.Web.Http.Filters.ActionFilterAttribute繼承,所以過濾器實際上沒有得到您的Web API控制器上執行。

有兩件事情可以做:

  • 要麼實現自己的過濾器,從System.Web.Http.Filters.ActionFilterAttribute
  • 繼承下面的代碼添加到您的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); 
    } 
    

對於這個你需要將邏輯從InitializeMembership轉變爲一個單獨的課程和作品確保您可以從global.asax訪問它。

相關問題