Вот пример из реальной жизни, где я также получаю доступ к информации и параметрам метода внутри атрибута фильтра действия:
Предположим, у меня есть метод контроллера с ActionAttribute следующим образом:
public class HomeController : Controller
{
...
[FeatureFlagActionAtrribute("user", new String[] { "Feature1" })]
public IActionResult DoSomethingWithFilterAction(String user)
{...}
}
HTTP-вызов будет примерно таким:
/Home/DoSomethingWithFilterAction?user="user1"
Теперь я хочу протестировать ActionAttribute FeatureFlagActionAtrribute в таком контексте.
Если вы примените приведенное выше предложение к этому примеру, это будет выглядеть так (по крайней мере, у меня сработало)
var methodInfoDoSomethingWithFilterAction = typeof(HomeController).GetMethod(nameof(HomeController.DoSomethingWithFilterAction));
var httpContext = new DefaultHttpContext();
var routeData = new RouteData();
FeatureFlagActionAtrribute FeatureFlagActionAtrributeFilter = methodInfoDoSomethingWithFilterAction.GetCustomAttribute<FeatureFlagActionAtrribute>();
ActionDescriptor actionDescriptor = new ControllerActionDescriptor()
{
ActionName = methodInfoDoSomethingWithFilterAction.Name,
ControllerName = typeof(FeatureFlagTest).Name,
DisplayName = methodInfoDoSomethingWithFilterAction.Name,
MethodInfo = methodInfoDoSomethingWithFilterAction,
};
ActionContext actionContext = new ActionContext(httpContext, routeData, actionDescriptor) ;
var homeController = new HomeController();
var attribute = new FeatureFlagActionAtrribute("user", new string[] { "feature1" });
IDictionary<string, object> actionArguments = new Dictionary<string, object>
{
["user"] = "user1"
};
var filterMetadata = new List<IFilterMetadata>() { featureFlagActionAtrributeFilter };
ActionExecutingContext actionExecutedContext = new
ActionExecutingContext(actionContext, filterMetadata, actionArguments, homeController);
attribute.OnActionExecuting(actionExecutedContext);
Затем внутри ActionFilterAttribute:
public override void OnActionExecuting(ActionExecutingContext context)
{
ControllerActionDescriptor actionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor;
Debug.Print($"2. @Before Method called {actionDescriptor.ControllerName}Controller.{actionDescriptor.ActionName}");
var controllerName = actionDescriptor.ControllerName;
var actionName = actionDescriptor.ActionName;
IDictionary<object, object> properties = actionDescriptor.Properties;
ParameterInfo[] paramsOfMethod = actionDescriptor.MethodInfo.GetParameters();
var fullName = actionDescriptor.DisplayName;
var paramNameForKeyOfFeature = ParamNameForKeyOfFeature;
var arguments = context.ActionArguments;
person
Roland Roos
schedule
15.04.2020