2013-05-12 29 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访问它。

相关问题