Search code examples
c#asp.net-web-apiaction-filter

Asp.net Web API - return data from actionfilter


I want to return a json object from the wep api actionfilter. How can I achieve this?

I can return the object from action but I need to return some data from the actionfilter on some condition.

Thanks in advance.


Edit: 1 When I changed the code like the following, the browser still loading without any response and ends in timeout error.

  public class ValidationActionFilter : ActionFilterAttribute
{

    public override void OnActionExecuting(HttpActionContext actionContext)
    {


        var modelState = actionContext.ModelState;
        if (!modelState.IsValid)
        {
            List<string> arr = new List<string>();
            foreach (var key in modelState.Keys)
            {
                var state = modelState[key];
                if (state.Errors.Any())
                {
                    string er = state.Errors.First().ErrorMessage;
                    if (!string.IsNullOrEmpty(er))
                    {
                        arr.Add(er);
                    }
                }
            }               

           var output =  new Result() { Status = Status.Error.ToString(), Data = null, Message = arr };
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, output, actionContext.ControllerContext.Configuration.Formatters.JsonFormatter);
        }     


    }
}

Solution

  • All you need is to assign the Response:

    public class MyActionFilterAttribute: ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            actionContext.Response = actionContext.Request.CreateResponse(
                HttpStatusCode.OK, 
                new { foo = "bar" }, 
                actionContext.ControllerContext.Configuration.Formatters.JsonFormatter
            );
        }
    }
    

    Assuming the following controller action:

    [MyActionFilter]
    public string Get()
    {
        return "OK";
    }
    

    this custom action filter will short-circuit the execution of the action and directly return the response we provided.