zoukankan      html  css  js  c++  java
  • 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()
            {
                    //业务代码略
            }
    }
  • 相关阅读:
    金蝶数据库执行语句
    金蝶 更新价格分录表触发器
    金蝶触发器,生成条码信息
    SQL从中文中获取拼音首字母
    C语言 typedef用法
    这姑娘漂亮不,说实话,有糖吃
    条码开发的意义在哪里
    ERP开发,重点不在功能
    金蝶出入库数据库表里加字段后出现的问题解决
    解决金蝶未检测到K/3许可文件,并且该账套已超过演示版期限问题
  • 原文地址:https://www.cnblogs.com/contraII/p/3822467.html
Copyright © 2011-2022 走看看