即使全局注册了Filter,它也不会在c# WebAPI中执行

本文关键字:WebAPI 执行 全局 注册 Filter | 更新日期: 2023-09-27 17:53:40

我正在做一个带有过滤器的WebAPI,该过滤器旨在对用户进行身份验证,但是每当我调用GET、PUT、POST或DELETE时,我的过滤器方法都没有被触发。

我已经读过很多这样的回答:

  • 使用IAuthorizationFilter
  • 使用IAuthenticationFilter
  • 使用ActionFilterAttribute

也:

  • 在控制器或动作的顶部应用属性
  • 在FilterConfig中注册过滤器,在global中注册全局过滤器。Asax

都试过了:

过滤器:

    namespace CumminsGroup.Filters
{
    public class AuthenticationFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Console.WriteLine("filterContext");
            //use filterContext.HttpContext.Request...
        }
    }
}

ApiController:

    namespace CumminsGroup.Controllers
{
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    [AuthenticationFilter]
    public class UserGroupsController : ApiController
    {        
        // GET: api/Groups
        public IQueryable<Group> GetGroups()
        {
            return db.Groups.Include("GroupUsers").Where(u=>u.status=="active");
        }
FilterConfig

:

namespace CumminsGroup
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new AuthenticationFilter());
            //filters.Add(new HandleErrorAttribute());
        }
    }
}

Global.asax:

namespace CumminsGroup
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);           
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

当执行HTTP请求时,过滤器将被跳过。filter函数被调用的唯一时刻是在主页控制器之前,也就是我运行项目的时候。

我错过了什么?

即使全局注册了Filter,它也不会在c# WebAPI中执行

你能区分MVC和WebAPI过滤器吗?

" GlobalConfiguration.Configuration。过滤器"vs"全局过滤器。过滤器"

MVCConfig.RegisterGlobalFilters(GlobalFilters.Filters);
WebApiConfig.RegisterGlobalFilters(GlobalConfiguration.Configuration.Filters);