快速业务通道

为ASP.NET MVC扩展异步Action功能

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
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)]


public sealed class AsyncStateAttribute : CustomModelBinderAttribute
{
private static AsyncStateModelBinder s_modelBinder = new AsyncStateModelBinder();
public override IModelBinder GetBinder()
{
return s_modelBinder;
}
}

使用方式如下:

[AsyncAction]
public ActionResult AsyncAction(AsyncCallback cb, [AsyncState]object state) { ... }

其实,基于Controller的扩展方法GetAsyncCallback和GetAsyncState均为公有方法,您也可以让 Action方法不接受这两个参数而直接从Controller中获取——当然这种做法降低了可测试性,不值得提倡 。

限制和缺点
如果这个解决方案没有缺陷,那么相信它已经被放入ASP.NET MVC 1.0中,而轮不到我在这里扩展一番 了。目前的这个解决方案至少有以下几点不足:

没有严格遵守.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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号