Во время вызова OnActionExecuting for Web API - Как сопоставить контроллер / класс действия из строки маршрута для чтения атрибутов действия

1

Как сопоставить строку входящего маршрута (например, Products/GetProduct) с контроллером/методом, который будет вызван (метод ProductController, GetProduct)?

Моя цель - проверить экземпляр ProductContoller для поиска настраиваемого атрибута, помещенного в метод GetProduct.

Я знаю, как проверить класс, как только я узнаю, с каким классом/методом я имею дело.

Я считал, что просто разделяю строку, поэтому вы получите "Продукты" и "GetProducts", затем я могу искать ProductController и в этом случае метод GetProducts.

Это может сработать, но похоже, что должно быть лучшее решение. Есть идеи?

Теги:
asp.net-web-api

3 ответа

3
Лучший ответ

Вы можете получить фактический экземпляр контроллера и атрибуты в действии, используя:

public class Somefilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var controller = actionContext.ControllerContext.Controller;
            var someFilterattributes = actionContext.ActionDescriptor.GetCustomAttributes<Somefilter>()
            var otherAttributes = actionContext.ActionDescriptor.GetCustomAttributes<Other>()
        }
    }

Где Другое - это другой фильтр для действия.

  • 3
    Это лучший ответ, который любой человек дал любому другому человеку в истории человечества.
  • 1
    Я склонен согласиться с вами @BenjaminGruenbaum. Я плачу от поэтической красоты.
0

В Web API для получения имени и действия контроллера:

Public Class MyClassActionFilter
    Inherits ActionFilterAttribute

    Public Overrides Sub OnActionExecuted(contexto As HttpActionExecutedContext)
        contexto.Request.Properties.Item("MS_HttpRouteData").Values("controller")
        contexto.Request.Properties.Item("MS_HttpRouteData").Values("action")
    End Sub

    Public Sub New

    End Sub

End Class

В WebApiConfig.vb добавьте глобальный фильтр, поэтому вам не нужно добавлять тег в заголовок всех методов

GlobalConfiguration.Configuration.Filters.Add(New MyClassActionFilter())
0

Вы можете получить имя контроллера, используя следующий код внутри вашего метода OnActionExecuting

var controller = actionContext.Request.GetRouteData().Values["controller"];
  • 0
    Не работает с WEB API. Это используется в ASP.NET MVC. В WEB API actionContext является типом HttpActionContext. В ASP.NET MVC actionContext является типом ActionExecutingContext.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню