WebApi 通过ActionFilter 来响应请求

如果在ActionFilterAttribute的OnActionExecuting事件中返回一个 HttpResponseMessage 作为 参数HttpActionContext 的Response属性

那么会直接返回,甚至不会执行action。比如 验证未通过,直接返回 Response

 

如果在OnActionExecuted 进行返回Response,那么会执行全部的 OnActionExecuted 事件。

同时如果action发生异常,那么还会覆盖掉action的 exception

 

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Http.ModelBinding;
using System.Web.Http.ValueProviders;

namespace WebApi.Controllers
{
    public class DemoController : ApiController
    {
        [Foobar]
        [Foobar2]
        [Foobar3]
        public string Get()
        {
            return "action正常执行";
        }
    }

    public class FoobarAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            actionContext.Response = actionContext.Request.CreateResponse<string>(HttpStatusCode.OK, "FooOnActionExecuting");
        }
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            //actionExecutedContext.Response = null;
            //actionExecutedContext.Exception = new Exception("在执行ActionFilter的OnActionExecuted方法过程中发生异常");
            //throw new Exception("自定义异常Foobar2Attribute");
        }

    }
    public class Foobar2Attribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            actionContext.ModelState.Add("Foo2", new ModelState() { Value = new ValueProviderResult("Foo", "Foo", null) });
        }
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            //actionExecutedContext.Response = null;
            //actionExecutedContext.Exception = new Exception("在执行ActionFilter的OnActionExecuted方法过程中发生异常");
            throw new Exception("自定义异常Foobar2Attribute");
        }
    }
    public class Foobar3Attribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            actionContext.ModelState.Add("Foo3", new ModelState() { Value = new ValueProviderResult("Foo", "Foo", null) });
        }
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            //actionExecutedContext.Response = null;
            //actionExecutedContext.Exception = new Exception("在执行ActionFilter的OnActionExecuted方法过程中发生异常");
            //actionExecutedContext.ActionContext.ModelState.Add("Foo3end", new ModelState() { Value = new ValueProviderResult("Foo3end", "Foo3end", null) });
            //throw new Exception("自定义异常Foobar2Attribute");
        }
    }
}


// 同一个action上多个actionfilter 会按照 顺序调用 OnActionExecuting 事件
//action 执行完毕后,会生成httpresponsemessage作为 OnActionExecuted 事件参数 HttpActionExecutedContext 的response属性
// 之后 会逆向调用 OnActionExecuted 事件

// 如果action里面发生异常,那么将会传递给 OnActionExecuted 事件参数 HttpActionExecutedContext,该参数 response属性会设定null,同时 Exception会设定成action的异常


// 当action发生异常时,
//如果是OnActionExecuting 发生异常,那么后续会执行已经成功执行过 actionfilter的OnActionExecuted事件
//如果是OnActionExecuted 发送异常,那么会覆盖掉action里面发生的异常,同时后续 actionfilter的OnActionExecuted事件都会正常执行

  

 

上一篇:【Vulnhub靶机渗透测试】之DC-4(teehee命令提权(在passwd或crontab中追加内容))


下一篇:asp.net core 将actionFilter 标记在控制器后 ,如何实现控制器内某个Action 避开检查