2016-11-03 4 views
2

私は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ですか?

答えて

0

問題はstructuremapの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)); 
     }); 
    } 
} 
関連する問題