web api 过滤器

 /// <summary>
    /// 渠道过滤器
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
    public class ChannelActionFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 请求接口之前渠道过滤
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var identity = ParseHeader(actionContext);
            if (identity == null)
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden,"请求来源未知,没有该接口访问权限。");
                return;
            }
            if (!ValidChannel(identity))
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden, "请求来源未知,没有该接口访问权限。");
            }
            base.OnActionExecuting(actionContext);
        }

        /// <summary>
        /// 渠道验证
        /// </summary>
        /// <param name="identity">渠道信息</param>
        /// <returns></returns>
        protected bool ValidChannel(ChannelIdentity identity)
        {
            ChannelsService svr = new ChannelsService();
            try
            {
                return svr.ValidateChannel(identity.SecretKey, identity.AppKey);
            }
            catch (Exception ex)
            {
                Logger.Warn("ChannelActionFilterAttribute[ValidChannel]:渠道来源校验时发生异常", ex);
                return false;
            }

        }

        /// <summary>
        /// 获取渠道信息
        /// </summary>
        /// <param name="actionContext"></param>
        protected ChannelIdentity ParseHeader(HttpActionContext actionContext)
        {
            IEnumerable<string> secretKeys = null;
            IEnumerable<string> appKeys = null;
            string secretKey = string.Empty;
            string appKey = string.Empty;
            if(actionContext.Request.Headers.TryGetValues("SecretKey", out secretKeys))
            {
                foreach (var key in secretKeys)
                {
                    secretKey = key;
                    break;
                }
            }

            if (actionContext.Request.Headers.TryGetValues("AppKey", out appKeys))
            {
                foreach (var key in appKeys)
                {
                    appKey = key;
                    break;
                }
            }

            if (!string.IsNullOrEmpty(secretKey) && !string.IsNullOrEmpty(appKey))
            {
                return new ChannelIdentity(secretKey, appKey);
            }
            return null;
        }
    }

控制器controller中使用过滤器:

  /// <summary>
    /// 用户管理
    /// </summary>
    [ChannelActionFilter, RoutePrefix("Media/Users")]
    public class UsersController : ApiController
    {
        //todo
    }
时间: 2024-10-14 01:29:24

web api 过滤器的相关文章

ASP.NET Web API 过滤器创建、执行过程(二)

前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器中,当然默认的基础服务也是有的,并且根据这些提供程序所获得的的过滤器信息集合进行排序.本篇就会对过滤器在创建完之后所做的一系列操作进行讲解. ASP.NET Web API 过滤器创建.执行过程(二) FilterGrouping过滤器分组类型 FilterGrouping类型是ApiController类型中的私有类型,它的作用就如同它的命名一样,用来对过

ASP.NET Web API 过滤器创建、执行过程(一)

前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就如今天的这个篇幅就是在上面内容之后所看到的一个知识要点之一. ASP.NET Web API 过滤器创建.执行过程(一) 下面就来讲解一下在ASP.NET Web API框架中过滤器的创建.执行过程. 过滤器所在的位置 图1 图1所示的就是控制器执行过程很粗略的表示. 通过上一篇内容我们了解到控制器方法选择器最后返回的并不是控制器方法,而是对于控制器方法描述

Web API过滤器

Web API包含在操作方法执行之前或之后添加额外的逻辑的过滤器.过滤器可用于提供横切特性,比如日志记录.异常处理.性能测量.身份验证和授权等等. 过滤器可以应用于Web API控制器或一个或多个操作方法上的属性.每个过滤器是必须实现System.Web.Http.Filters命名空间中的IFilter接口的类.然而,System.Web.Http.Filters命名空间还包括其他其他可用于创建特定过滤器的接口和类. 下表列出了可用于创建Web API过滤器的重要的接口和类. 过滤器类型 接口

MVC和Web API 过滤器Filter

MVC和Web API Filter(过滤器) ASP.NET MVC 支持以下类型的操作筛选器: ·        授权筛选器.这些筛选器用于实现IAuthorizationFilter和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全决策.AuthorizeAttribute类和RequireHttpsAttribute类是授权筛选器的示例.授权筛选器在任何其他筛选器之前运行. ·        操作筛选器.这些筛选器用于实现IActionFilter以及包装操作方法执行.I

MVC和Web API 过滤器Filter [转]

ASP.NET MVC 支持以下类型的操作筛选器: ·        授权筛选器.这些筛选器用于实现IAuthorizationFilter和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全决策.AuthorizeAttribute类和RequireHttpsAttribute类是授权筛选器的示例.授权筛选器在任何其他筛选器之前运行. ·        操作筛选器.这些筛选器用于实现IActionFilter以及包装操作方法执行.IActionFilter接口声明两个方法:OnA

Web API 方法的返回类型、格式器、过滤器

一.Action方法的返回类型 a) 操作方法的返回类型有四种:void.简单或复杂类型.HttpResponseMessage类型.IHttpActionResult类型. b) 如果返回类型为void,请求结束后HTTP状态码为204(No Content),如果返回类型为复杂类型,则对象会被转化为Json字符串后传输. c) 从图示的Web API的大致交互过程可以看到,Controll返回的是HttpResponseMessage类型,然后转换为HttpResponse提供给调用端.同时

Web API之过滤器执行过程原理解析【二】(十一)

前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授权上的自定义特性的执行过程. APiController 之前有讲到该APiController,也就稍微介绍了,这节我们来详细此Web API控制器的基类: 1 public abstract class ApiController : IHttpController, IDisposable 2

C# web api 中过滤器的使用

一.开篇 Fiter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等:Web API提供两种过滤器的基本类型:actionfilterattribute,exceptionfilterattribute:两个类都是抽象类,actionfilter主要实现执行请求方法体之前(覆盖基类方法OnActionExecuting),和之后的事件处理(覆盖基类方法OnActionExecuted):exceptionfilter主要实现触发异常方法(覆盖基类方法OnException

Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案 (精髓)

前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说起.问题大概有以下几点: 1.项目层的文件夹结构 2.解决MVC的Controller和Web API的Controller类名不能相同的问题 3.给MVC不同命名空间的Area的注册不同的路由 4.让Web API路由配置也支持命名空间参数 5.MVC及Web API添加身份验证及错误处理的过滤器