为了账号安全,请及时绑定邮箱和手机立即绑定

使用 ActionFilterAttribute 扩展限制 ASP.NET Web Api

使用 ActionFilterAttribute 扩展限制 ASP.NET Web Api

C#
慕侠2389804 2021-08-07 17:34:43
我正在尝试向我的 Web Api 应用程序添加使用限制。但是,未实现自定义属性。自定义属性using System;using System.Web;using System.Web.Caching;using System.Web.Mvc;namespace MyApp.Filters{    public enum TimeUnit    {        Minute = 60,        Hour = 3600,        Day = 86400    }    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]    public class ThrottleAttribute : ActionFilterAttribute    {        public TimeUnit TimeUnit { get; set; }        public int Count { get; set; }        public override void OnActionExecuting(ActionExecutingContext filterContext)        {            ...        }    }}控制器namespace MyApp.Controllers{    public class GetUsersController : ApiController    {        [Throttle(TimeUnit = TimeUnit.Minute, Count = 5)]        [Throttle(TimeUnit = TimeUnit.Hour, Count = 20)]        [Throttle(TimeUnit = TimeUnit.Day, Count = 100)]        public ICollection<Users> Get(int id)        {            ...        }    }}我走远了吗?不正确地实现属性?扩展错误的属性?我知道我正在使用System.Web.Mvc而不是System.Web.Http.Filters......但我所看到的所有资源都要求这样做。也许你有更好的答案?:)
查看完整描述

2 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

确保您base.OnActionExecuting(filterContext)在代码中的某个时刻调用。如果您使用 .NET Standard(不了解 Core),那么您还应该记住在 App_Start\FilterConfig.cs 中注册您的过滤器:


public static void RegisterGlobalFilters(GlobalFilterCollection filters)

{

    //add this part

    filters.Add(new ThrottleAttribute());

}


查看完整回答
反对 回复 2021-08-07
?
FFIVE

TA贡献1797条经验 获得超6个赞

问题是因为您使用的是ActionFilterAttributefrom System.Web.Mvc,而不是 from System.Web.Http.Filters,正如您在问题中提到的。


MVC 过滤器只会作为 MVC 生命周期的一部分为控制器执行。API 控制器的 HTTP 过滤器也是如此。这意味着您的属性应该如下所示:


using System.Web.Http.Controllers;

using System.Web.Http.Filters;


public class ThrottleAttribute : ActionFilterAttribute

{

    // Note the different signature to what you have in your question.

    public override void OnActionExecuting(HttpActionContext actionContext)

    {

        //

    }

}

如果您现在在该方法上放置一个断点,并调用您的 API 控制器,它应该会命中它。


如果您想将现有过滤器用于 MVC 控制器,那将很好用。


查看完整回答
反对 回复 2021-08-07
  • 2 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信