65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 中的“即发即弃” Web 方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (6投票s)

2013年6月1日

CPOL

6分钟阅读

viewsIcon

34574

本文档介绍在传统 ASP.NET Web 服务中创建和使用单向 Web 方法。

引言: 
在很多情况下,我们可能会遇到这样的情况:我们想从正在使用的应用程序调用一个 Web 方法,但我们不想等待请求被处理,或者我们不期望从该 Web 方法中获得任何返回值。就像我们说的“即发即弃”。

例如:我们有一个客户端 Web 应用程序,它使用一个 Web 服务。这个特定的 Web 方法被 Web 应用程序用来将大量记录从某个文件推送到数据库。并且,正在使用的应用程序不期望得到任何结果,它只希望知道 Web 方法是否被成功调用。调用此方法后,Web 应用程序将继续进行自己的处理,而无需等待 Web 方法完成其处理。 
如何实现此功能:  
要实现上述功能,在 asp.net web service 中创建 Web 方法时,我们必须使用属性[SoapDocumentMethod(OneWay = true)]来修饰 Web 方法。您认为这能满足上述要求吗?它不能。要实现这一点,我们必须以一种能够适应单向异步机制的方式设置 Web 服务的代理类。我们该怎么做?下一节将通过示例进行说明。不仅要修改代理和 Web 方法,还要在正在使用的客户端中进行支持性的管道连接才能实现这一点。 
示例项目: 在这里,我将通过一个示例项目,一步一步地展示这一点。1) 创建一个用 SoapDocumentMethod One-way 设置为 true 的 Web 服务,它接受一个 int 参数,并让线程等待几毫秒以显示一些正在发生的事情,否则您可以拥有自己的代码,这些代码需要一些时间来完成执行。 在这里,我们完成了 Web 方法的工作,除此之外,在此方面没有其他事情需要做。有一件重要的事情需要注意,那就是 Web 方法的返回类型在这里被设置为 void。
2) 在同一个解决方案中创建(为了方便,在同一个解决方案中)一个正在使用的应用程序。

 
好了,我们已经创建了一个 Web 服务和一个使用者。我们的下一个任务是为单向方法的使用进行管道连接,为此,我们需要在我们的 Web 应用程序的使用者中创建一个代理。
3) 通过添加 Web 引用创建代理的步骤如下: 

 

 


我们已成功地在我们的 Web 应用程序的使用者中添加了 Web 引用。您可以在下面的截图看到。 

 
到目前为止一切都很好,对吧?现在我们将在我们的 Web 应用程序的使用者中进行管道连接。看 

为此,我将创建一个 Web 服务对象在我们正在使用的 Web 应用程序中。查看我们从 IntelliSense 获得的提示,它将显示 2 个 Web 方法,但我们只创建了一个,对吧?

看看下面显示所有 Web 方法的截图。 


是的,您可以看到我们的 HelloWorldOneWay、HelloWorldOneWayAsync 和一个名为 HellowWorldOneWayCompleated 的事件。 

在这里,我们将使用 HelloWorldOneWayAsync,因为我们将使用“即发即弃”机制。
现在我已经完成了事件的管道连接。您可以在下面看到
 

我所做的是创建代理对象。然后我将 HellowWorldOnewayCompleated 事件与一个事件处理程序连接起来。您可以在下面的整个代码片段中看到。 

using System; 
using System.Collections.Generic; 
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Diagnostics;
namespace OnewayConsumer
{
    public partial class _Default : System.Web.UI.Page
    {        
        MyOneWayService.OneWayWebService objProxy = null;
        string strTimeElapsed = string.Empty;
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void btnClick_Click(object sender, EventArgs e)
        {
            Stopwatch objStopWatch = new Stopwatch();
            objProxy = new MyOneWayService.OneWayWebService();
            objProxy.HelloWorldOneWayCompleted += new MyOneWayService.HelloWorldOneWayCompletedEventHandler(objProxy_HelloWorldOneWayCompleted);
            objStopWatch.Reset();
            objStopWatch.Start();
            objProxy.HelloWorldOneWayAsync(Convert.ToInt32(txtWaitTime.Text.Trim()));
            strTimeElapsed = objStopWatch.ElapsedMilliseconds.ToString();
        }
        void objProxy_HelloWorldOneWayCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            lblResult.Text = "Fired and Forgot.....!!!!! Took ' "+strTimeElapsed+" 'to Complete Execution";
        }
    }
} 

现在运行应用程序……我们的页面将如下所示


在此页面上,我们需要做的是在文本框中输入一个整数值,然后等待响应到来……

我们期望的是,如果我们输入 10000 毫秒,根据我们的 Web 服务方法,它将花费 10000 毫秒来完成执行并返回。但我们所做的是,只是触发 Web 服务方法,然后在不等待 Web 方法完成执行的情况下返回到应用程序,对吧?

作为第一步,请执行该应用程序 

在文本框中输入 10000,然后点击 GO,看看会发生什么……。

结果将是一个错误,类似 


为了缓解此错误,我们需要在 Default.aspx 页面的代码隐藏中设置一个名为 Async=true 的属性 


添加此项后,看看会发生什么。再次在文本框中输入 10000,看看我们需要等待多少毫秒才能收到响应。

哇!!!!!看看发生了什么,它只用了 55 毫秒就执行了。从中我们可以解读出什么?
是的,我们可以说 Web 方法已被调用,并且在不等待 Web 方法执行完成的情况下,控制权已返回到正在使用的应用程序。
您现在可能会想,是否有必要用 HelloWorldOneWayAsync 修饰 Web 方法,为什么我们不直接使用 HelloWorldOneWay,只需在顶部提供单向属性?它会起作用吗?是的,当然可以。要使 Web 方法成为单向的,只需在 Web 方法的顶部添加属性 [SoapDocumentMethod(OneWay = true)]。无需通过勾选 Async 相关复选框来设置服务引用并连接提供的事件。您是否感到困惑?… Smile | <img src= " />  
我现在想问一个问题……如果我们使用“即发即弃”机制,如果 Web 服务宕机了会怎么样,消费者怎么知道 Web 服务有问题并且它没有被调用?希望现在您已经明白了。对吧?
为此,我们使用异步 Web 方法和事件,只是想知道 Web 服务方法是否已成功调用且没有任何错误。
那么下一个问题是……我们如何识别服务中发生的错误,或者我们如何识别服务调用是成功的。您可以在下面的答案中看到。
 

 是的,AsyncCompletedEventArgs 的 Error 属性会给我们错误信息。

让我们看看当 Web 服务宕机时我们会得到什么错误。为此,我在服务引用 (Reference.cs) 类中将 Web 服务的名称编辑为错误名称,然后执行了应用程序,并在正在使用的应用程序中设置了一个断点,并验证了 e.Error。通过这样做,我得到了一个错误,类似 

可以看到,我们可以这样获得服务的错误。我使用的主要目的是识别服务是正常运行还是宕机。
您想看看同步 Web 方法的执行时间差异吗?
为此,我创建了一个新的 Web 方法,其代码与之前相同,但没有用单向属性 HelloWorldNotOneWay(int milliSeconds) 进行修饰。

在这里,我将从另一个按钮点击事件调用新创建的 Web 方法。
 
查看执行时间和返回控制权所花费时间的区别。
 
这就是我所理解的关于单向 Web 服务方法的一切。这可能对开发者很有用。 
谢谢   

© . All rights reserved.