我有Asp.Net MVC应用程序,我使用了结构图, 我使用自定义ThrottleAttribute ActionFilter。 关注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;
}
}
}
使用ThrottleAttribute后抛出异常:
Setter Property'Time'(ActionFilters.TimeUnit):未明确定义所需的原始依赖
我的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 Property'Time'(ActionFilters.TimeUnit):未明确定义所需的原始依赖
我该怎么办?
如何明确定义PrimitiveTypes?
答案 0 :(得分:1)
问题在于在结构图中注册ActionFilterClass。我已将其更改如下:
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(
!p.PropertyType.IsPrimitive &&
!p.PropertyType.IsEnum &&
p.PropertyType != typeof(string));
});
}
}