快速业务通道

领先技术 - 再探异步ASP.NET页

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
步和异步路由。下面是注册异步路由的旧方法:

routes.MapAsyncRoute(

   "Default",

   "{controller}/{action}/{id}",

   new { controller = "Home", action = "Index", id =  "" }

);

您必须使用 MapAsyncRoute 扩展方法,而不是传统同步方法所用的标准 MapRoute。不过,在 ASP.NET MVC 2 RC 中,已经消除了这种区别。现在,无论 随后将如何执行操作,注册路由都采用一种方式,即使用 MapRoute 方法。

因此,以常规方式处理请求的 URL,并确定要使用的控制器类的名称。实际上 ,需要在派生自新 AsyncController 类的控制器类上定义异步方法,如下所示:

public class TestController : AsyncController

{

  ...

}

如果控制器类继承自 AsyncController,则用于将操作名称映射到方法的约定 有些不同。AsyncController 类可以处理同步和异步请求。因此,所使用的约定 可识别出方法 Run 和方法 RunAsync,如下所示:

public class TestController : AsyncController

{

  public ActionResult Run(int id)

  {

    ...

  }

  public void RunAsync(int id)

  {

    ...

  }

}

但是,如果执行上述代码,将引发异常(请参见图 3)。

异步操作通过名称来标识,预期的模式为 xxxAsync,其中 xxx 表示要执行的 操作的默认名称。显然,如果存在另一个名为 xxx 的方法,并且未使用属性进行 区分,则会引发异常,如图 3 所示。

图 3 操作名称中的不明确引用

“Async”这个词被视为后缀。用于调用 RunAsync 方法的 URL 仅包含前缀“ Run”。例如,以下 URL 将调用方法 RunAsync,将值 5 作为路由参数传递:

http://myserver/demo/run/5

将此操作解析为同步操作还是异步操作,取决于 AsyncController 类中的方 法。但是,xxxAsync 方法仅识别操作的触发器。请求的终结器是控制器类中的另 一个方法,名为 xxxCompleted:

public ActionResult RunCompleted(DataContainer data)

{

   ...

}

请注意用于定义异步操作的这两个方法的不同签名。触发器应为 void 方法。 如果将它定义为返回任何值,则返回值将被忽略。通常,xxxAsync 方法的输入参 数需要进行模型绑定。终结器方法通常返回一个 ActionResult 对象,接收一个 包含待处理数据的自定义对象并将数据传递给视图对象。要将由触发器计算的值 与终结器声明的参数进行匹配,需要使用一个特殊协议。

AsyncController 类

AsyncController 控制器类继承自 Controller,它实现一组新的接口,如下 所示:

public abstract class AsyncController :  Controller,

         IAsyncManagerContainer,

IAsyncController, IController

异步控制器最独特的方面是具有专门的操作调用程序对象,该对象在底层使用 ,用于执行操作。该调用程序需要一个计数器来跟踪操作的数目,这些操作构成 总体操作,并且必须在可以声明总体操作终止之前进行同步。图 4 提供了异步操 作的示例实现。

图 4 简单的异步操作方法

public void RunAsync(int id)

{

   AsyncManager.OutstandingOperations.Increment();


   var d = new DataContainer();

    ...


   // Do some remote work (i.e., invoking a service)

    ...


   // Terminate operations 

   AsyncManager.Parameters["data"] = d;

   AsyncManager.OutstandingOperations.Decrement();

}

public ActionResult RunCompleted(DataContainer data)

{

   ...

}

AsyncManager 类上的 OutstandingOperations 成员提供

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号