Search code examples
c#asp.net-mvcowinwebapiaction-filter

How To Use ActionFilters in OwinSelfHost


I use microsoft.owin to self host WebApi in ConsoleApplication
but the ActionFilters Doesnt Fire in app . here is my actionFilter :

public class FilterA : Attribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (!filterContext.RouteData.GetRequiredString("controller").Equals("account", StringComparison.CurrentCultureIgnoreCase) //long condition evaluating to true
                                                                                                                                  //logic controlling these filters dont apply to Foo/Bar and Foo/Baz
             && (!filterContext.RouteData.GetRequiredString("controller").Equals("Foo", StringComparison.CurrentCultureIgnoreCase)
                 || (!filterContext.RouteData.GetRequiredString("action").Equals("Bar", StringComparison.CurrentCultureIgnoreCase)
                     && !filterContext.RouteData.GetRequiredString("action").Equals("Baz", StringComparison.CurrentCultureIgnoreCase))
                 )
             )
        {
            filterContext.Result = new RedirectResult("~/Foo/Bar");
        }
    }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.RouteData.GetRequiredString("controller").Equals("account", StringComparison.CurrentCultureIgnoreCase) //long condition evaluating to true
                                                                                                                                  //logic controlling these filters dont apply to Foo/Bar and Foo/Baz
            && (!filterContext.RouteData.GetRequiredString("controller").Equals("Foo", StringComparison.CurrentCultureIgnoreCase)
                || (!filterContext.RouteData.GetRequiredString("action").Equals("Bar", StringComparison.CurrentCultureIgnoreCase)
                    && !filterContext.RouteData.GetRequiredString("action").Equals("Baz", StringComparison.CurrentCultureIgnoreCase))
                )
            )
        {
            filterContext.Result = new RedirectResult("~/Foo/Bar");
        }
    }
}

and is use it like this but the FilterA Doesnt Fire . Whats The Problem

    [FilterA]
    [Route("RpTDAccounting")]
    [HttpGet]
    public IHttpActionResult RpTDAccounting()
    {

        return Ok();
    }

Solution

  • should use System.Web.Http.Filters namespace instead of System.web.mvc
    and impelment IActionFilter Like this :

    public class FilterA : Attribute, IActionFilter
    {
        public bool AllowMultiple => throw new NotImplementedException();
    
        public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
        {
            throw new NotImplementedException();
        }
    }