Как сопоставить строку входящего маршрута (например, Products/GetProduct) с контроллером/методом, который будет вызван (метод ProductController, GetProduct)?
Моя цель - проверить экземпляр ProductContoller для поиска настраиваемого атрибута, помещенного в метод GetProduct.
Я знаю, как проверить класс, как только я узнаю, с каким классом/методом я имею дело.
Я считал, что просто разделяю строку, поэтому вы получите "Продукты" и "GetProducts", затем я могу искать ProductController и в этом случае метод GetProducts.
Это может сработать, но похоже, что должно быть лучшее решение. Есть идеи?
Вы можете получить фактический экземпляр контроллера и атрибуты в действии, используя:
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>()
}
}
Где Другое - это другой фильтр для действия.
В 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())
Вы можете получить имя контроллера, используя следующий код внутри вашего метода OnActionExecuting
var controller = actionContext.Request.GetRouteData().Values["controller"];