ASP.NET服务器端异步Web方法

『 更新时间:2008-4-6 』『 字体:变小 变大 』『 作者:佚名 | 来源:互联网


  每个方法的 WSDL 都是相同的。

  在 ASMX 处理程序反映程序集并检测到某个异步 Web 方法后,它必须以不同于处理同步请求的方式处理对该方法的请求。它将调用 BeginXXX 方法,而不是某个简单方法。它将传入的请求还原序列化到要传递到函数的参数中(与处理同步请求时一样);但是它还将指针传递到一个内部回调函数(作为 BeginXXX 方法的额外 AsyncCallback 参数)。

  这种方法类似于 .NET Framework 中 Web 服务客户端应用程序的异步编程模式。如果客户端支持异步 Web 服务调用,则可以为客户端计算机释放占用的线程;如果服务器端支持异步 Web 服务调用,则可以释放服务器计算机上占用的线程。但这里有两个关键的区别。首先,不是由服务器代码调用 BeginXXX 和 EndXXX 函数,而是由 ASMX 处理程序调用。其次,您要为 BeginXXX 和 EndXXX 函数编写代码,而不能使用由 WSDL.EXE 或 Visual Studio .NET 中的 Add Web Reference(添加 Web 引用)向导生成的代码。但结果是相同的,即释放线程以使其能够执行其他进程。

  ASMX 处理程序调用服务器的 BeginXXX 函数后,会将线程返回到进程线程池,使之能够处理接收到的任何其他请求。但是,还不能释放请求的 HttpContext。ASMX 处理程序将等待,直到它传递给 BeginXXX 函数的回调函数被调用,它才结束处理请求。

  一旦回调函数被调用,ASMX 处理程序将调用 EndXXX 函数,使您的 Web 方法可以完成任何所要执行的处理,并且可以得到被序列化到 SOAP 响应中的返回数据。EndXXX 函数返回后将发送响应,只有此时该请求的 HttpContext 才得到释放。
简单的异步 Web 方法

  为举例说明异步 Web 方法,我从一个名为 LengthyProcedure 的简单同步 Web 方法开始,其代码如下所示。然后我们再看一看如何异步完成相同的任务。LengthyProcedure 只占用给定的毫秒数。
[WebService]
public class SyncWebService : System.Web.Services.WebService
{
  [WebMethod]
  public string LengthyProcedure(int milliseconds)
  {
    System.Threading.Thread.Sleep(milliseconds);
    return "成功";
  }
}

  现在我们将 LengthyProcedure 转换为异步 Web 方法。我们必须创建如前所述的 BeginLengthyProcedure 函数和 EndLengthyProcedure 函数。请记住,我们的 BeginLengthyProcedure 调用需要返回一个 IAsyncResult 接口。这里,我打算使用一个委托以及该委托上的 BeginInvoke 方法,让我们的 BeginLengthyProcedure 调用进行异步方法调用。传递到 BeginLengthyProcedure 的回调函数将被传递到委托上的 BeginInvoke 方法,从 BeginInvoke 返回的 IAsyncResult 将被 BeginLengthyProcedure 方法返回。

  当委托完成时,将调用 EndLengthyProcedure 方法。我们将调用委托上的 EndInvoke 方法,以传入 IAsyncResult,并将其作为 EndLengthyProcedure 调用的输入。返回的字符串将是从该 Web 方法返回的字符串。下面是其代码:

[WebService]
public class AsyncWebService : System.Web.Services.WebService
{
  public delegate string LengthyProcedureAsyncStub(
    int milliseconds);

  public string LengthyProcedure(int milliseconds)
  {
    System.Threading.Thread.Sleep(milliseconds);
    return "成功";
  }

  public class MyState
  {
    public object previousState;
    public LengthyProcedureAsyncStub asyncStub;
  }

  [ System.Web.Services.WebMethod ]
  public IAsyncResult BeginLengthyProcedure(int milliseconds,
    AsyncCallback cb, object s)
  {
    LengthyProcedureAsyncStub stub
      = new LengthyProcedureAsyncStub(LengthyProcedure);
    MyState ms = new MyState();
    ms.previousState = s;
    ms.asyncStub = stub;
    return stub.BeginInvoke(milliseconds, cb, ms);
  }

  [ System.Web.Services.WebMethod ]
  public string EndLengthyProcedure(IAsyncResult call)
  {
    MyState ms = (MyState)call.AsyncState;
    return ms.asyncStub.EndInvoke(call);
  }
}


  何时采用异步 Web 方法

  在确定是否适合在您的应用程序中采用异步 Web 方法时,有几个问题需要考虑。首先,调用的 BeginXXX 函数必须返回一个 IAsyncResult 接口。IAsyncResult 是从多个异步 I/O 操作返回的,这些操作包括访问数据流、进行 Microsoft? Windows? 套接字调用、执行文件 I/O、与其他硬件设备交互、调用异步方法,当然也包括调用其他 Web 服务。您可以从这些异步操作中得到 IAsyncResult,以便从 BeginXXX 函数返回它。您也可以创建自己的类以实现 IAsyncResult 接口,但随后可能需要以某种方式包装前面提到的某个 I/O 操作。

  对于前面提到的大多数异步操作,使用异步 Web 方法包装后端异步调用很有意义,可以使 Web 服务代码更有效。但使用委托进行异步方法调用时除外。委托会导致异步方法调用占用进程线程池中的某个线程。不幸的是,ASMX 处理程序为进入的请求提供服务时同样要使用这些线程。所以与对硬件或网络资源执行真正 I/O 操作的调用不同,使用委托的异步方法调用在执行时仍将占用其中一个进程线程。您也可以占用原来的线程,同步运行您的 Web 方法。

上一页  [1] [2] [3] 下一页

【点击数:】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口

关文章

您的姓名:
评分等级:
1分 2分 3分 4分 5分
评论内容:
1、严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
2、用户需对自己在使用金石网服务过程中的行为承担法律责任。
3、本站管理员有权保留或删除评论内容。
4、评论内容只代表网友个人观点,与本网站立场无关。
  • 金石网
  • | 设为首页 | 加入收藏 | 联系我们 | 版权申明 | 友情链接 | 站点地图 | 网站帮助 | 网站留言 | 广告服务 |
  • Copyright © 2001-2008 KingsNet.biz All Rights Reserved. 闽ICP备05026663号
  • 返回网站顶部