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

C# 使用ActionFilterAttribute扩展限制ASP.NET Web Api,c#,asp.net,asp.net-mvc,asp.net-web-api,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 }

我正在尝试向我的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)
        {
            ...
        }
    }
}
名称空间MyApp.Controllers
{
公共类GetUsersController:ApicController
{
[节气门(时间单位=时间单位.分钟,计数=5)]
[节气门(时间单位=时间单位.小时,计数=20)]
[节气门(时间单位=时间单位.天,计数=100)]
公共ICollection获取(int id)
{
...
}
}
}

我走远了吗?不正确地实现属性?扩展错误的属性?我知道我使用的是
System.Web.Mvc
而不是
System.Web.Http.Filters
。。。但我看到的所有资源都要求这样做。也许你有更好的答案?:)

确保在代码中的某个点调用
base.OnActionExecuting(filterContext)
。如果您使用的是.NET标准(不了解Core),则还应记住在App_Start\FilterConfig.cs中注册过滤器:

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

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

出于好奇-为什么要这样做?你的要求是什么?因为如果它与正在使用的系统资源相关,那么在管道的早期,就有更有效的节流方法。与其他选项相比,动作过滤器相对“晚了”。老实说,因为我发现其他人都这么做了。如果您有更好的方法来实现节流,请让我知道。此外,这个应用程序非常旧,.NET framework 4.5和WebApi 4.0-因此我尝试使用几个nuget软件包进行节流,但它试图更新整个应用程序以获得更高版本的WebApi,并放弃了所有其他功能。这很公平,但我的意思是,你为什么要这么做?你一开始为什么要节流?您是通过节流来控制用户对服务的使用,还是为了保护您的系统资源不受过度工作的影响?我的经理担心人们会编写循环并试图不断向API发送请求(可能会使服务器陷入困境等等)。我的印象是(除非最终用户真的是混蛋),它将是单线程的,所以这不应该是一个问题。但这是经理们想要的。请将代码发布到覆盖函数中。也许您忘记调用
base.OnActionExecuting(filterContext)