其实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=,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实现的接口访问统计、接口缓存等的更多相关文章

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

    上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...

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

    原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model ...

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

    原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...

  4. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  5. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

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

    对于一个较大规模的Web应用,我们可以从功能上通过Area将其划分为较小的单元.每个Area相当于一个独立的子系统,具有一套包含Models.Views和Controller在内的目录结构和配置文件. ...

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

    一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class Custom ...

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

    这是今天遇到的一个实际问题,在这篇随笔中记录一下解决方法. ASP.NET Web API提供了CORS支持,但ASP.NET MVC默认不支持,需要自己动手实现.可以写一个用于实现CORS的Acti ...

  9. Asp.Net Mvc基于Fleck开发的多人网页版即时聊天室

    一.项目的核心说明 1.Fleck这个是实现websocket一个比较简单第三方组件,它不需要安装额外的容器.本身也就几个接口可供调用. 2.项目是基于.net framework 4.7.2 ,在v ...

随机推荐

  1. ios23--动画做弹出提示框toast

    ) { /* [UIView animateWithDuration:2.0 animations:^{ // 执行动画 self.showHUB.text = @"当前购物车已空,赶紧买买 ...

  2. phpstorm配置php脚本执行

    1.到设置中配置 2.配置具体项 3.完了就可以执行php脚本了

  3. xubuntu 17.04 和 iphone 6互传文件方法——使用libimobiledevice就可以像u盘一样操作文件了

    I need to preface this by saying I'm also new to Linux, but I've got it working I think. The instruc ...

  4. jquery uploadify在谷歌浏和火狐下无法上传的解决方案(.Net版)

    在项目紧张的进行过程中,jquery uploadify上传不兼容的问题一直没有试着去解决,只幻想着用ie的人越来越多,怎么奈何firefox4刚推出,就有4000万的下载.......仰天长叹,记生 ...

  5. 【高德地图API】SDK v1.1.1 在代码中设置Map中心点Center级别不起作用

    有时候你在初始化地图时不是直接在xaml中设置Map的Center,而是在cs代码中设置Center或者设置SetZoomAndCenter改变中心点和缩放级别.你可能会发现,不起作用. 这边提出的解 ...

  6. bzoj 1492: [NOI2007]货币兑换Cash【贪心+斜率优化dp+cdq】

    参考:http://www.cnblogs.com/lidaxin/p/5240220.html 虽然splay会方便很多,但是懒得写,于是写了cdq 首先要想到贪心的思路,因为如果在某天买入是能得到 ...

  7. bzoj1015星球大战(并查集+离线)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 5572  Solved: 2563 Descri ...

  8. [JOI2014] 小笼包

    题面 : https://www.ioi-jp.org/joi/2013/2014-yo/2014-yo-t6/2014-yo-t6.html 题解 dp + 康托展开 一看这题不知道怎么处理 只能枚 ...

  9. python tkinter窗口置顶

    下面两句即可实现root窗口的置顶显示,可以用于某些程序的消息提示,能够弹出到桌面显示 root = Tk()root.wm_attributes('-topmost',1)

  10. SuperSocket学习笔记(一)-一个完整的例子

    一.什么是SuperSocket 以下是作者的介绍 执行以下命令,获取SuperSocket项目 $ git clone https://github.com/kerryjiang/SuperSock ...