扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“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, FuncendDelegate) { this.AsyncResult=asyncResult; this.EndDelegate=endDelegate; } publicIAsyncResultAsyncResult{get;privateset;} publicFunc EndDelegate{get;privateset;} publicoverridevoidExecuteResult(ControllerContextcontext) { context.Controller .SetAsyncResult(this.AsyncResult) .SetAsyncEndDelegate(this.EndDelegate); } }
“ASP.NET MVC框架的ActionInvoker是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流