仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 601|回复: 8
打印 上一主题 下一主题

[学习教程] 来一篇关于NET的ASP.NET MVC自界说过滤属性完成log功效

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:26:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
可怜的程序员,还是逃不出移植的命运!如今的企业级开辟项目,出格是网站一样平常城市用到log功效,想一想年夜部分会用EnterpriseLoggingApplicationBlock的功效大概本人写一个组件,纪录体系日记事务,更好的跟踪懂得体系运转情形,现用ASP.NETMVC的过滤属性完成log功效!

ASP.NETMVC的filter是一个属性,能够使用到controller后者action.当Controller大概actionmethod被挪用时,ASP.NETMVC的filter在挪用实行前后会被触发。先看下当Control内里的action被挪用时的使用承继,自界说类log的最终效果:



要完成下面的效果,现自界说一个类LogMessageAttribute,LogMessageAttribute承继接口IActionFilter,IResultFilter,也能够选择性的承继重写类FilterAttribute。
IActionFilterinterface界说为:
publicinterfaceIActionFilter
{
//Methods
voidOnActionExecuted(ActionExecutedContextfilterContext);
voidOnActionExecuting(ActionExecutingContextfilterContext);
}
OnActionExecuting:在Controller内里的actionmethod挪用之前运转
OnActionExecuted:在Controller内里的actionmethod挪用以后运转,可是在IResultFilter接口的OnResultExecuting办法实行之前
IResultFilterinterface界说为:
publicinterfaceIResultFilter
{
//Methods
voidOnResultExecuted(ResultExecutedContextfilterContext);
voidOnResultExecuting(ResultExecutingContextfilterContext);
}
OnResultExecuting:在Controller内里的actionmethod挪用处置玩前实行.
OnResultExecuted:在Controller内里的actionmethod挪用处置玩后实行.
接上去是重头戏:LogMessageAttribute自界说类
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,Inherited=true,AllowMultiple=true)]
publicclassLogMessageAttribute:FilterAttribute,IActionFilter,IResultFilter
{
///<summary>
///<paramname="LogName">日记文件路径</para>
///</summary>
publicstringLogName{get;set;}

///<summary>
///纪录工夫,体系版本,以后线程ID等纪录
///</summary>
///<paramname="controller"></param>
///<paramname="action"></param>
///<paramname="message"></param>
publicvoidLogMessage(stringcontroller,stringaction,stringmessage)
{
if(!string.IsNullOrEmpty(LogName))
{
TextWriterwriter=newStreamWriter(LogName,true);
writer.WriteLine("#################Begin#################");
writer.WriteLine("Time:[{0}]",DateTime.Now.ToString("yyyy-MM-dd-hh:mm:ss"));
writer.WriteLine("Controller:{0}",controller);
writer.WriteLine("Action:{0}",action);
writer.WriteLine("Message:{0}",message);
writer.WriteLine("OperatingSystemversionis:{0}",System.Environment.OSVersion.Version.ToString());
writer.WriteLine("CurrentThreadIDis:{0}",AppDomain.GetCurrentThreadId());
writer.WriteLine("###############Over###############");
writer.Close();

}
}
publicvoidOnActionExecuting(ActionExecutingContextfilterContext)
{
LogMessage(filterContext.RouteData.Values["controller"].ToString(),
filterContext.RouteData.Values["action"].ToString(),
"Actionexeuting...");
}
publicvoidOnActionExecuted(ActionExecutedContextfilterContext)
{
LogMessage(filterContext.RouteData.Values["controller"].ToString(),
filterContext.RouteData.Values["action"].ToString(),
"Actionexecuted.");
}
publicvoidOnResultExecuting(ResultExecutingContextfilterContext)
{
LogMessage(filterContext.RouteData.Values["controller"].ToString(),
filterContext.RouteData.Values["action"].ToString(),
"Resultexecuting...");
}
publicvoidOnResultExecuted(ResultExecutedContextfilterContext)
{
LogMessage(filterContext.RouteData.Values["controller"].ToString(),
filterContext.RouteData.Values["action"].ToString(),
"Resultexecuted");
}
}
自界说好LogMessageAttribute类,使用到Controller大概action的属性。在Controller正在实行,大概出现一个View,一个HTTP哀求数据时,就会在日记文件纪录一些日记.
在项目标Controller内里使用自界说的属性
[Logging(LogName=@"D:ProjectProjectMVCProjectsky.ExtendMVCFrameworksky.ExtendMVCFrameworkLog.log")]
publicActionResultDesplayEmployee()
{
ViewData["Message"]="Ouremployeeswelcomeyoutooursite!";
List<Employee>employees=newList<Employee>
{
newEmployee{
FirstName="sky",
LastName="yang",
Email="weflytotti@163.com",
Department="Development"
},
newEmployee{
FirstName="sky",
LastName="yang",
Email="weflytotti@163.com",
Department="Development"
}
};
returnView(employees);
}
运转程序,正如文章入手下手所看到的截图!
总结:自界说ASP.NETMVC的过滤属性完成本人想要的功效只必要承继IActionFilter,IResultFilter。
既然话题已经抄起,我打算今晚发篇博文再引导一下舆论方向,使它再火两天,抛砖引玉,而且赵劼先生一直在跟帖,使.NET阵营的我感到万分难得。
透明 该用户已被删除
沙发
发表于 2015-1-18 14:39:59 | 只看该作者
ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。
爱飞 该用户已被删除
板凳
发表于 2015-2-2 22:04:12 | 只看该作者
对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。
深爱那片海 该用户已被删除
地板
发表于 2015-2-8 11:34:50 | 只看该作者
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
因胸联盟 该用户已被删除
5#
发表于 2015-2-25 11:04:48 | 只看该作者
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
蒙在股里 该用户已被删除
6#
发表于 2015-3-7 20:46:45 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
若天明 该用户已被删除
7#
发表于 2015-3-15 14:13:37 | 只看该作者
众所周知,Windows以易用而出名,也因此占据不少的服务器市场。
8#
发表于 2015-3-22 02:07:59 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
活着的死人 该用户已被删除
9#
发表于 2015-3-22 02:09:03 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 09:56

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表