Asp.Net MVC 응용 프로그램이 있고 구조체 맵을 사용했습니다. 사용자 지정 ThrottleAttribute ActionFilter를 사용합니다.Setter 속성 필수 프리미티브 종속성이 명시 적으로 정의되어 있지 않습니다.
setter 속성 '시간'(ActionFilters.TimeUnit) : 나는 ThrottleAttribute 던져 예외를 사용 후 는 rate limiting in asp.net mvc
public enum TimeUnit { Minute = 60, Hour = 3600, Day = 86400 } [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public class ThrottleAttribute : ActionFilterAttribute { public TimeUnit Time { get; set; } public int Count { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext) { var seconds = Convert.ToInt32(Time); var key = string.Join( "-", seconds, filterContext.HttpContext.Request.HttpMethod, filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.ActionDescriptor.ActionName, filterContext.HttpContext.Request.UserHostAddress ); // increment the cache value var cnt = 1; if (HttpRuntime.Cache[key] != null) { cnt = (int)HttpRuntime.Cache[key] + 1; } HttpRuntime.Cache.Insert( key, cnt, null, DateTime.UtcNow.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.Low, null ); if (cnt >= Count) { filterContext.Result = new ContentResult { Content = "You are allowed to make only " + Count + " requests per " + Time.ToString().ToLower() }; filterContext.HttpContext.Response.StatusCode = 429; } } }
에 따라 필요한 기본 의존성이 명시 적으로
그리고 내 ActionFilter을 정의되지 않은 레지스트리 :
public class ActionFilterRegisteryClass : StructureMap.Registry
{
public ActionFilterRegisteryClass(Func<StructureMap.IContainer> containerFactory)
{
For<IFilterProvider>().Use(
new StructurMapFilterProvider(containerFactory));
Policies.SetAllProperties(x =>
{
x.Matching(p =>
p.DeclaringType.CanBeCastTo(typeof(ActionFilterAttribute)) &&
(
p.DeclaringType.Namespace.StartsWith("MyNamespace")
) &&
!p.PropertyType.IsPrimitive &&
p.PropertyType != typeof(string)
);
});
}
}
예외가 발생했습니다 : container.BuildUp (filter.Instance);
public class StructurMapFilterProvider : FilterAttributeFilterProvider
{
private readonly Func<StructureMap.IContainer> _Container;
public StructurMapFilterProvider(Func<StructureMap.IContainer> container)
{
_Container = container;
}
public override IEnumerable<Filter> GetFilters(ControllerContext controllerContext,
ActionDescriptor actionDescriptor)
{
var filters = base.GetFilters(controllerContext, actionDescriptor);
var container = _Container();
foreach (var filter in filters)
{
container.BuildUp(filter.Instance);
yield return filter;
}
}
}
setter 속성 '시간'(ActionFilters.TimeUnit) : 필요한 원시 의존성이 명시 적으로
어떻게해야합니까
정의되지 않는 이유는 무엇입니까?명시 적으로 정의 된 PrimitiveTypes는 무엇입니까?