WEBAPI ScopeFilter执行顺序以及OverrideActionFilters
OverrideActionFilters
当我们在Global设定过滤器时,有些function不希望被卡住,那么就可以在function上面设定OverrideActionFilters ,不执行
在这之前,我们要知道ScopeFilter的执行顺序
Global=》Controller=》Action
如果在action上设定OverrideActionFilters ,那么 Global 和 Controller 将被忽略
如果在Controller 上设定OverrideActionFilters ,那么 Global 将被忽略
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace WebApi.Controllers
{
internal static class HttpRequestMessageExtensions
{
public static IList GetFilters(this HttpRequestMessage requestMessage)
{
object filters;
if (!requestMessage.Properties.TryGetValue("__filters", out filters))
{
filters = new List();
requestMessage.Properties.Add("__filters", filters);
}
return (IList)filters;
}
}
[ControllerScopeFilter]
public class FooController : ApiController
{
[ActionScopeFilter]
public IEnumerable Get()
{
return this.Request.GetFilters().Select(filter => filter.GetType().Name);
}
}
[ControllerScopeFilter]
public class BarController : ApiController
{
[ActionScopeFilter]
[OverrideActionFilters]
public IEnumerable Get()
{
return this.Request.GetFilters().Select(filter => filter.GetType().Name);
}
}
[ControllerScopeFilter]
public class BazController : ApiController
{
public IEnumerable Get()
{
return this.Request.GetFilters().Select(filter => filter.GetType().Name);
}
}
[ControllerScopeFilter]
[OverrideActionFilters]
public class QuxController : ApiController
{
public IEnumerable Get()
{
return this.Request.GetFilters().Select(filter => filter.GetType().Name);
}
}
public abstract class FilterBaseAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
actionContext.Request.GetFilters().Add(this);
}
}
public class GlobalScopeFilterAttribute : FilterBaseAttribute { }
public class ControllerScopeFilterAttribute : FilterBaseAttribute { }
public class ActionScopeFilterAttribute : FilterBaseAttribute{ }
}