5

我使用默认的 ASP.NET MVC4 Web 应用程序模板和 Visual Studio 在过滤器目录中创建InitializeSimpleMembershipAttribute并像这样创建帐户控制器:

[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(用户名,密码,persistCookie:RememberMe))

并说:在调用“WebSecurity”类的任何其他方法之前,必须先调用“WebSecurity.InitializeDatabaseConnection”方法。

我在InitializeSimpleMembershipAttribute中运行它,并且 webapi 控制器与控制器相同。

为什么属性不在 WebAPI 中运行?

4

1 回答 1

4

-[InitializeSimpleMembership]属性继承自System.Web.Mvc.ActionFilterAttribute

Web API 的操作过滤器需要继承自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.

于 2013-05-12T22:46:54.940 回答