Throttle ASP.NET Web Api с расширением ActionFilterAttribute - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь добавить дроссель использования в свое приложение 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)
        {
            ...
        }
    }
}

AmЯ ухожу?Реализует атрибут неправильно?Расширение неправильного атрибута?Я знаю, что я использую System.Web.Mvc вместо System.Web.Http.Filters ... но все ресурсы, которые я видел, требовали именно этого.Может быть, у вас есть лучший ответ?:)

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Проблема в том, что вы используете ActionFilterAttribute из System.Web.Mvc, а не из System.Web.Http.Filters, как вы упомянули в своем вопросе.

Фильтры MVC будут выполняться только для контроллеракак часть жизненного цикла MVC.То же самое касается фильтров HTTP для контроллеров API.Это означает, что ваш атрибут должен выглядеть следующим образом:

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, который будет работать просто отлично.

0 голосов
/ 12 июня 2018

Убедитесь, что вы звоните base.OnActionExecuting(filterContext) в какой-то момент в вашем коде.Если вы используете .NET Standard (не знаю о Core), то вам также следует помнить о том, чтобы зарегистрировать свой фильтр в App_Start \ FilterConfig.cs:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    //add this part
    filters.Add(new ThrottleAttribute());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...