其实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. 【PA 2014】Kuglarz

    [题目链接]            点击打开链接 [算法]            sum[i]表示前i个杯子中,杯子底下藏有球的杯子总数            那么,知道[i,j]这段区间中,藏有球的 ...

  2. softmax function in c++

    #include <iostream> #include <vector> #include <cmath> #include <algorithm> ...

  3. 将数据从数据仓库Hive导入到MySQL

    1.启动Hadoop,hive,mysql 2.在mysql中建表(需要导入数据的) mysql> CREATE TABLE `dbtaobao`.`user_log` (`user_id` v ...

  4. nginx - ubutun下安装nginx(详述编译方法)

    一.使用apt命令安装 sudo apt-get install nginx 二.编译方法安装(个人实践方法,具体见官方文档) 1)说明:我使用的虚拟机是64位 ubuntu server14.04, ...

  5. matlab进入指定目录

    cd C:\Users\hui\Desktop\minepy\1\minepy-1.2.0\minepy-1.2.0\matlab

  6. Android 网络请求及数据处理

    Android 网络请求: 1.Volley   http://blog.csdn.net/t12x3456/article/details/9221611 2.Android-Async-Http  ...

  7. Google C++编程规范 – 第十九条 -《前置声明》

    转自:http://roclinux.cn/?p=3285 本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc wu == [规范] ...

  8. NestedPreb

    屌丝手动版 One of the things we’re sorely missing from Unity is nested prefabs. So we rolled this little ...

  9. Unity ScriptObject

    http://godstamps.blogspot.com/2012/02/unity-3d-scriptableobject-assetbundle.html http://ivanozanchet ...

  10. P2252 取石子游戏

    传送门 威佐夫博弈结论:若石子数为\(a,b(a<b)\),当且仅当\((y-x)*\frac{(\sqrt{5}+1)}{2}=x\)的时候先手必败 证明 //minamoto #includ ...