网站主页   操作系统    网络工程    服务器    网页制作    数据库    程序开发    网络安全    办公软件   
讲座日期: 本周六下午1点30分 抢座
讲座地点: 北大青鸟马甸校区
主讲老师: 王老师 金牌讲师
讲座主题: 网络安全
讲座内容: 检测、防御、黑客信息,如何过滤不安全的网站,如何防御黑客的进攻。
订座电话: 010-82011432/33
  您当前位置:主页 > 网络学院 > 程序开发 > ASP.NET >

ASP.NET MVC框架的ActionInvoker




  对于执行同步Action的SyncMvcHandler,其实现十分简单而直接,以下是ASP.NET MVC框架的ActionInvoker。

publicclassSyncMvcHandler:IHttpHandler,IRequiresSessionState  
{  
publicSyncMvcHandler(  
IControllercontroller,  
IControllerFactorycontrollerFactory,  
RequestContextrequestContext)  
{  
this.Controller=controller;  
this.ControllerFactory=controllerFactory;  
this.RequestContext=requestContext;  
}  
 
publicIControllerController{get;privateset;}  
publicRequestContextRequestContext{get;privateset;}  
publicIControllerFactoryControllerFactory{get;privateset;}  
 
publicvirtualboolIsReusable{get{returnfalse;}}  
 
publicvirtualvoidProcessRequest(HttpContextcontext)  
{  
try  
{  
this.Controller.Execute(this.RequestContext);  
}  
finally  
{  
this.ControllerFactory.ReleaseController(this.Controller);  
}  
}  
} 

  而对于异步Action,我之前一直思考着怎么将框架的默认实现,也就是单个方法调用,转化成两个方法(BeginXxx/EndXxx)调用。曾经我想过自己实现一个新的ActionInvoker,但是这就涉及到了大量的工作,尤其是如果希望保持ASP.NET MVC框架现有的功能(ActionFilter,ActionSelector等等),最省力的方法可能就是继承ControllerActionInvoker,并设法使用框架已经实现的各种辅助方法。但是在分析了框架代码之后我发现复用也非常困难,举例来说,ControllerActionInvoker判定一个方法为Action的依据之一是这个方法返回的是ActionResult类型或其子类,这意味着我无法直接使用这个方法来获取一个返回IAsyncResult的BeginXxx方法;同理,对于查找EndXxx方法,我可能需要在请求名为Abc的异步Action时,将EndAbc作为查找依据交由现成的方法来查询——但是,如果又有一个请求是直接针对一个名为EndAbc的同步Action的那又怎么办呢?

  由于这些问题存在,我在去年设法实现异步Action时几乎重写了整个ActionInvoker ——其复杂程度可见一斑。而且那个实现对于一些特殊情况的处理依旧不甚友好,需要开发人员在一定程度上做出妥协。这个实现在TechED 2008 China的Session中公布时我就承认它并不能让我满意,建议大家不要将其投入生产环境中。而现在的实现,则非常顺利地解决了整个问题。虽然从理论上讲还不够“完美”,虽然还做出了一些让步。

  带来如此多问题的原因就在于我们在设法颠覆框架内部的关键性设计,也就是从单一的Action方法调用,转变为“符合APM的”二段式调用。等等,您是否感觉到了解决问题的关键?没错,那就是“符合APM的”。APM要求我们将一个行为分为BeginXxx和EndXxx两个方法,可是既然ASP.NET MVC框架只能让我们返回一个ActionResult对象……那么我们为什么不在这个对象里包含方法的引用——也就是一个委托对象呢?这虽然不符合正统的APM签名,但是完全可行,不是吗?

publicclassAsyncActionResult:ActionResult  
{  
publicAsyncActionResult(  
IAsyncResultasyncResult,  
Func<IAsyncResult,ActionResult>endDelegate)  
{  
this.AsyncResult=asyncResult;  
this.EndDelegate=endDelegate;  
}  
 
publicIAsyncResultAsyncResult{get;privateset;}  
 
publicFunc<IAsyncResult,ActionResult>EndDelegate{get;privateset;}  
 
publicoverridevoidExecuteResult(ControllerContextcontext)  
{  
context.Controller  
.SetAsyncResult(this.AsyncResult)  
.SetAsyncEndDelegate(this.EndDelegate);  
}  
} 


上一篇:浅析ASP.NET MVC工程  
下一篇:浅谈ASP.NET MVC框架
相关信息:

·asp.net+SQL实现数据回滚 ·ASP.net实现在线音频、视频播放功能
·利用ASP.net开发邮件发布系统 ·优秀ASP.NET程序员的修炼之路
·ASP和ASP.Net共享Session解决办法 ·ASP.NET技术获取IP与MAC地址的方法
·ASP.Net中利用CSS实现多界面两方法 ·浅谈ASP.NET MVC框架
·浅析ASP.NET MVC工程 ·什么是ASP.NET MVC?

Copyright © 2002-2015 版权所有
学校地址:北京市海淀区西三旗建材城中路29号北大青鸟
招生热线:010-82011433/32 京公网安备110102004704  京ICP备05043413号 京公网安备110102004704