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=,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实现的接口访问统计、接口缓存等的更多相关文章
- ASP.NET MVC 基于角色的权限控制系统的示例教程
上一次在 .NET MVC 用户权限管理示例教程中讲解了ASP.NET MVC 通过AuthorizeAttribute类的OnAuthorization方法讲解了粗粒度控制权限的方法,接下来讲解基于 ...
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model ...
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
原文:ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则 对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象, ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- Asp.net MVC 基于Area的路由映射
对于一个较大规模的Web应用,我们可以从功能上通过Area将其划分为较小的单元.每个Area相当于一个独立的子系统,具有一套包含Models.Views和Controller在内的目录结构和配置文件. ...
- ASP.net MVC 基于角色的权限控制系统的实现
一.引言 我们都知道ASP.net mvc权限控制都是实现AuthorizeAttribute类的OnAuthorization方法. 下面是最常见的实现方式: public class Custom ...
- jQuery+ASP.NET MVC基于CORS实现带cookie的跨域ajax请求
这是今天遇到的一个实际问题,在这篇随笔中记录一下解决方法. ASP.NET Web API提供了CORS支持,但ASP.NET MVC默认不支持,需要自己动手实现.可以写一个用于实现CORS的Acti ...
- Asp.Net Mvc基于Fleck开发的多人网页版即时聊天室
一.项目的核心说明 1.Fleck这个是实现websocket一个比较简单第三方组件,它不需要安装额外的容器.本身也就几个接口可供调用. 2.项目是基于.net framework 4.7.2 ,在v ...
随机推荐
- linux之安装软件出现Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)解决总结
sudo rm -rf /var/lib/dpkg/lock sudo rm -rf /var/cache/apt/archives/lock
- react-native 项目更名步骤
刚开始开发项目的时候,更没有想好一个项目名称,如何才能更名一个RN APP名称呢,可按照如下方式操作即可. 使用说明 更改package.json { "name": " ...
- leetcode 784. Letter Case Permutation——所有BFS和DFS的题目本质上都可以抽象为tree,这样方便你写代码
Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...
- 4.7.6 Compaction of LR Parsing Tables
4.7.6 Compaction of LR Parsing Tables A typical programming language grammar with 50 to 100 terminal ...
- bzoj4868
http://www.lydsy.com/JudgeOnline/problem.php?id=4868 三分+贪心 我们可以知道这是一个单峰函数 当A>B那么我们每次调整一个的价钱是最佳的,所 ...
- jquery对所有<input type="text"的控件赋值
function resetData() { $("input[type=text]").each( function() { $(this).attr ...
- 在Linux环境下使用OpenSSL对消息和文件进行加密(转载)
转自:http://netsecurity.51cto.com/art/201301/378513.htm 1.简介 OpenSSL是一款功能强大的加密工具包.我们当中许多人已经在使用OpenSSL, ...
- bzoj 1599: [Usaco2008 Oct]笨重的石子【枚举】
--我为什么要写这种题解-- 枚举投掷情况即可 #include<iostream> #include<cstdio> using namespace std; int s1, ...
- 300 Longest Increasing Subsequence 最长上升子序列
给出一个无序的整形数组,找到最长上升子序列的长度.例如,给出 [10, 9, 2, 5, 3, 7, 101, 18],最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4.因为可能会有 ...
- python使用mysql connection获取数据感知不到数据变化问题
在做数据同步校验的时候,需要从mysql fetch数据和hbase的数据进行对比,发现即使mysql数据变化了,类似下面的代码返回的值还是之前的数据.抽取的代码大概如下: import MySQL ...