我正在尝试为我的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" />`
);
}
。{也许你有更好的答案? :)
答案 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控制器,那就可以了。