asp.net mvc,基于aop实现的接口访问统计、接口缓存等

其实asp.net 上aop现有的框架应该蛮多的,比如静态注入式的PostSharp(新版本好像已经商业化了,旧版本又不支持.net4.0+),或者通过反射的(性能会降低)。

本文则是通过mvc其中一种方法拦截器ActionFilter(参考网上已经有很多类似例子)。

首先新建一个日志控制类,命名为ApiLogAttribute,继承于ActionFilterAttribute

/// <summary>
    /// 记录访问日志以及站点安全检查
    /// </summary>
    public class ApiLogAttribute : ActionFilterAttribute
    {
        #region 属性

         private string logType;
         public ApiLogAttribute(string type)
        {
            logType = type;
        }

        #endregion

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            if (string.IsNullOrEmpty(logType))
                return;
            AccessSummaryHelper.AddOneVisit(logType);//自己实现接口访问量统计的代码

            //这里可以约定 增加一些接口校验,避免无效的请求。return;

            //校验不通过的,则直接返回,不会进入方法体内
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, new ApiResult{ code=1,Msg="无效的请求。"});
 }
}

接着,再建一个接口方法缓存类,命名为ApiCacheAttribute,继承自ActionFilterAttribute

public class ApiCacheAttribute : ActionFilterAttribute//,System.Web.Mvc.ActionFilterAttribute
    {    //设置缓存的时间,默认为1分钟
        private CacheTimeOption cacheTime ;
        public ApiCacheAttribute(CacheTimeOption cachetime = CacheTimeOption.OneMinute)
        {
            cacheTime = cachetime;
        }

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            base.OnActionExecuting(actionContext);

            string cacheKey = HttpContext.Current.Request.RawUrl;
            ApiResult ret = CacheHelper.Get<ApiResult>(cacheKey);

            //在action执行前终止请求时,应该使用填充方法Response,将不返回action方法体。
            if (ret != null)
            {
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, ret);
            }
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            string cacheKey = HttpContext.Current.Request.RawUrl;
            var obj = ((ObjectContent)(actionExecutedContext.Response.Content)).Value;

            if (obj != null)
            {
                ApiResult ret = obj as ApiResult;
                if (ret != null)
                {
                    CacheHelper.Set(cacheKey, ret, cacheTime);
                }
            }
        }
    }

注意上面 ApiResult为自定义的接口返回类。

public class ApiResult
{
        public int Code{ get; set; }

        public string Msg { get; set; } 

        public object Data { get; set; } }

最后在具体的类接口上调用如下:

 public class XXController : ApiController
    {

        [HttpGet]
        [ApiCache]
        [ApiLog("1.1")]
        public ApiResult GetXX()
        {
                //业务代码略
        }
}

asp.net mvc,基于aop实现的接口访问统计、接口缓存等,布布扣,bubuko.com

时间: 2024-10-19 02:27:23

asp.net mvc,基于aop实现的接口访问统计、接口缓存等的相关文章

ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上

原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效.如果我们能够将ValidationAttribute特性直接应用到参数上,我们不但可以实现简单类型(比如int.double等)数据的Model验证,还能够实现“一个Model类型,多种验证规则”,本篇文章将为你提供相关的解决方案(源代码

ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来说,针对应聘的岗位不同,肯定对应聘者的年龄.性别.专业技能等方面有不同的要求.但是ASP.NET MVC的Model验证确是Model驱动的,因为验证规则以验证特性的形式应用到Model类型及其属性上.这样的验证

ASP.net MVC 基于角色的权限控制系统的实现

一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class CustomAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (!filterContext.RequestContext

ASP.NET MVC 基于角色的权限控制系统的示例教程

上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于角色的权限控制方法. 基于角色的权限控制方法概述 基于角色的权限控制系统RBAC(Role Based Access Control)是目前最流行,也是最通用的权限控制系统.所谓基于角色的权限控制,就是将各个操作权限分组,每一个组就是一个角色,举个例子:管理员拥有所有的权限,编辑就只拥有写文章和发布

Asp.net MVC 基于Area的路由映射

对于一个较大规模的Web应用,我们可以从功能上通过Area将其划分为较小的单元.每个Area相当于一个独立的子系统,具有一套包含Models.Views和Controller在内的目录结构和配置文件.一般来说,每个Area具有各自的路由规则(URL模版上一般会体现Area的名称),而基于Area的路由映射通过AreaRegistration进行注册. 一.创建Areas 右键工程 -> 添加->区域 添加后生成一套包含Models.Views和Controller在内的目录结构和配置文件:只是

jQuery+ASP.NET MVC基于CORS实现带cookie的跨域ajax请求

这是今天遇到的一个实际问题,在这篇随笔中记录一下解决方法. ASP.NET Web API提供了CORS支持,但ASP.NET MVC默认不支持,需要自己动手实现.可以写一个用于实现CORS的ActionFilterAttribute,我们就是这么实现的: public class AllowCorsAttribute : ActionFilterAttribute { private string[] _domains; public AllowCorsAttribute(string dom

ASP.NET MVC 基于表达式的动态查询

项目源码地址:https://gitee.com/zhengwei804/DynamicCustomSearch 原文地址:https://www.cnblogs.com/qingshang/p/Dynamic_Expression_Custom_Search.html

Asp.net Mvc4 基于Authorize实现的模块访问权限

在MVC中,我们可以通过在action或者controller上设置Authorize[Role="xxx"] 的方式来设置用户对action的访问权限.显然,这样并不能满足我们的需求, 对于一般的MVC系统来说,如果我们定义一个controller来处理一个模块的话,我们大致有以下需求: 一,单个action的访问权限.如果删除,列表action 二,一个action两种权限,如edit(int? id)如果id为null则添加,或者修改 三,在此cotroller验证其它模块权限,

ASP.NET MVC下的四种验证编程方式[续篇]

在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注ValidationAttribute特性"."让数据类型实现IValidatableObject或者IDataErrorInfo"),那么在ASP.NET MVC框架内部是如何提供针对这四种不同编程方式的支持的呢?接下来我们就来聊聊这背后的故事. 一.ModelValidator与ModelVal