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

时间:2018-06-12 14:35:22

标签: c# asp.net asp.net-mvc asp.net-web-api

我正在尝试为我的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 ...但我所看到的所有资源都要求使用import Unity from 'react-native-unity-webgl'; ... render() { return ( <Unity width="500px" height="350px" onProgress={ this.onProgress } src="http://192.168.1.101/Build/Ultimatum.json" loader="http://192.168.1.101/Build/UnityLoader.js" />` ); } 。{也许你有更好的答案? :)

2 个答案:

答案 0 :(得分:0)

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

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    //add this part
    filters.Add(new ThrottleAttribute());
}

答案 1 :(得分:0)

问题是因为您正在使用ActionFilterAttribute中的System.Web.Mvc,而不是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控制器,那就可以了。