[英]Why is my ASP.NET Web API ActionFilterAttribute OnActionExecuting not firing?
[英]Throttle ASP.NET Web Api with ActionFilterAttribute extension
我正在尝试向我的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
...,但是我所看到的所有资源都恰恰要求这样做。 也许您有一个更好的答案? :)
确保在代码中的某个时刻正在调用base.OnActionExecuting(filterContext)
。 如果使用的是.NET Standard(不了解Core),则还应该记住在App_Start \\ FilterConfig.cs中注册过滤器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//add this part
filters.Add(new ThrottleAttribute());
}
问题是因为您使用的是System.Web.Mvc
ActionFilterAttribute
,而不是问题中提到的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控制器,则可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.