Action过滤器
1.OnActionExecuting
在Action方法调用前使用,使用场景:如何验证登录等。
2.OnActionExecuted
在Action方法调用后,result方法调用前执行,使用场景:异常处理。
3.OnResultExecuting
在result执行前发生(在view 呈现前),使用场景:设置客户端缓存,服务器端压缩.
4.OnResultExecuted
在result执行后发生,使用场景:异常处理,页面尾部输出调试信息。
我们在访问接口时有时需要在Hearder头部加上Authorization认证,具体操作如下
WebApiConfig类中Register方法添加认证控制,然后重写OnActionExecuting 方法
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.Filters; namespace WebApplication2 { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Filters.Add(new ApiPermissionFilter()); //注册全局API Action过滤器 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } public class ApiPermissionFilter : ActionFilterAttribute { public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) { var anonymousAction = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>(); if (!anonymousAction.Any()) { var status = GetCurUserInfo(actionContext.Request); if (!status) { actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpError("error")); base.OnActionExecuting(actionContext); } } } public static bool GetCurUserInfo(HttpRequestMessage Request) { var status = false; var Authorization = Request.Headers.Authorization; if (Authorization != null && Authorization.Scheme == "Basic") { //可以针对token做一些其他判断 status = true; } return status; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; namespace WebApplication2.Controllers { public class TestController : ApiController { [HttpGet,HttpPost] public void GetValue(Message value) { //{"name":"1","id":"2"} } [HttpGet] [AllowAnonymous]//加上这个可忽略token认证 public void GetValue2(string value) { } } public class Message { public string name { get; set; } public string id { get; set; } } }