为什么class属性不是在工作的WebAPI? [英] Why class attribute not work in WebAPI?

查看:83
本文介绍了为什么class属性不是在工作的WebAPI?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I used default ASP.NET MVC4 Web Application Template and Visual Studio Create InitializeSimpleMembershipAttribute in Filters Directory and create account Controller like this:

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

和我尽量让的AccountController的WebAPI,我的code是:

and i try to make AccountController WebAPI, my code is:

[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,它在这个换行符:

now, when i call api, its break in this line:

如果(WebSecurity.Login(用户名,密码,persistCookie:与rememberMe))

if (WebSecurity.Login(UserName, Password, persistCookie: RememberMe))

和说:您必须调用WebSecurity.InitializeDatabaseConnection的方法,你所说的WebSecurity类的任何其他方法之前

我跑它的 InitializeSimpleMembershipAttribute 并的WebAPI控制器一样的是控制器。

i ran it in InitializeSimpleMembershipAttribute and webapi controller is same with controller.

为什么不属性中的WebAPI跑?

why attribute not run in WebAPI?

推荐答案

[InitializeSimpleMembership] -attribute从继承System.Web.Mvc。 ActionFilterAttribute

The [InitializeSimpleMembership]-attribute inherits from System.Web.Mvc.ActionFilterAttribute

对Web API操作筛选需要从 System.Web.Http.Filters.ActionFilterAttribute 继承,所以过滤器实际上并没有得到你的Web API控制器上执行。

Action filters for Web API need to inherit from System.Web.Http.Filters.ActionFilterAttribute, so the filter is not actually getting executed on your Web API controller.

有两件事情可以做:


  • 要么实现自己的过滤器,从 System.Web.Http.Filters.ActionFilterAttribute 继承

  • 添加以下code到你的的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的访问

For this to work you need to move the logic from InitializeMembership into a separate class and make sure you can access it from the global.asax.

这篇关于为什么class属性不是在工作的WebAPI?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆