为ASP.NET MVC扩展异步Action功能
cessRequest方法中保存下来的EndDelegate取出,调用,把得到的ActionResult再执行一遍即可 。
以上的代码只涉及到普通情况下的逻辑,而在完整的代码中还会包括对于Action方法被某个Filter终 止或替换等特殊情况下的处理。此外,无论在BeginProcessRequest还是EndProcessRequest中都需要对异 常进行合适地处理,使得Controller Factory能够及时地对Controller对象进行释放。 ModelBinder支持 其实您到目前为止还不能使用异步Action,因为您会发现方法的AsyncCallback参数得到的永远是null 。这是因为默认的Model Binder无法得知如何从一个上下文环境中得到一个AsyncCallback对象。这一点 倒非常简单,我们只需要构造一个AsyncCallbackModelBinder,而它的BindModel方法仅仅是将 AsyncMvcHandler.BeginProcessRequest方法中保存的AsyncCallback对象取出并返回: public sealed class AsyncCallbackModelBinder : IModelBinder { public object BindModel( ControllerContext controllerContext, ModelBindingContext bindingContext) { return controllerContext.Controller.GetAsyncCallback(); } } 其使用方式,便是在应用程序启动时将其注册为AsyncCallback类型的默认Binder: protected void Application_Start() { RegisterRoutes(RouteTable.Routes); ModelBinders.Binders[typeof(AsyncCallback)] = new AsyncCallbackModelBinder(); } 对于asyncState参数您也可以使用类似的做法,不过这似乎有些不妥,因为object类型实在过于宽泛 ,并不能明确代指asyncState参数。事实上,即使您不为asyncState设置binder也没有太大问题,因为对 于一个异步ASP.NET请求来说,其asyncState永远是null。如果您一定要指定一个binder,我建议您在每 个Action方法的asyncState参数上标记如下的Attribute,它和AsyncStateModelBinder也已经被一并建入 项目中了: [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)] 使用方式如下:
其实,基于Controller的扩展方法GetAsyncCallback和GetAsyncState均为公有方法,您也可以让 Action方法不接受这两个参数而直接从Controller中获取——当然这种做法降低了可测试性,不值得提倡 。 限制和缺点 没有严格遵守.NET中的APM模式,虽然不影响功能,但这始终是一个遗憾。 由于利用了框架中的现成功能,所有的Filter只能运行在BeginXxx方法上。 由于EndXxx方法和最终ActionResult的执行都没有Filter支持,因此如果在这个过程中抛出了异常, 将无法进入ASP.NET MVC建议的异常处理功能中。 根据ASP.NET MVC框架的Roadmap,ASP.NET MVC框架1.0之后的版本中将会支持异步Action,相信以上 这些缺陷到时候都能被弥补。不过这就需要大量的工作,这只能交给ASP.NET MVC团队去慢慢执行了。事 实上,您现在已经可以在ASP.NET MVC RC源代码的MvcFutures项目中找到异步Action处理的相关内容。它 添加了IAsyncController,AsyncController,IAsyncActionInvoker,AsyncControllerActionInvoker等 许多 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |