您如何衡量网络服务电话的进度?

时间:2008-09-25 19:32:38

标签: ajax web-services asp.net-ajax asynchronous

我有一个ASP.NET Web服务,可以执行一些繁重的工作,例如,一些文件操作,或者从一堆水晶报表生成Excel表格。我不希望通过调用此Web服务来阻止,所以我想让Web服务调用异步。另外,我想从网页上调用这个Web服务,并希望有一些机制可以让我继续轮询服务器,这样我就可以在屏幕上显示一些进度指示,比如说,文件的数量。已经处理完毕。请注意,我不希望在完成Web方法调用时收到通知,而是希望获得实时进度状态。我该怎么做呢?

6 个答案:

答案 0 :(得分:4)

在服务器上编写一个单独的方法,您可以通过传递已调度的作业的ID来查询该方法,该方法返回0到100(或0.0到1.0之间,或者其他)的近似值。

E.g。在REST风格中,您可以向http://yourserver.com/app/jobstatus/4133/发出GET请求,该请求会返回一个简单的'52'作为text/plain。然后你只需要查询每一个(秒?两秒?十秒?),看看它有多远。

如何实际完成对后端的监控取决于您的流程及其工作原理。

答案 1 :(得分:2)

我认为XML Web服务很慢,因此创建多种方法并且轮询进度将非常慢并且会在服务器上产生巨大负载。我不会在生产环境中这样做。我看到数据库轮询存在相同(但较小)的问题。

尝试 SOAP扩展。它实现了一个事件驱动的模型。请参阅Adding a Progress Bar to Your Web Service Client Application on MSDN

答案 2 :(得分:2)

您还可以use SoapExtensions通知您的客户下载/处理进度。然后,服务器可以向客户端发送事件。如果您不使用它,客户端中的任何内容都不得更改。

在您的客户端允许这样的内容:

//...
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService ();
_myWebService.processDelegate += ProgressUpdate;
_myWebService.CallHeavyMethod();
//...

private void ProgressUpdate(object sender, ProgressEventArgs e)
{
  double progress = ((double)e.ProcessedSize / (double)e.TotalSize) * 100.00;
  //Show Progress...
}

答案 3 :(得分:1)

让初始“启动报告生成”Web服务调用在某个任务池中创建任务,并向调用者返回任务的ID。

然后,提供另一种返回给定taskId的“完成百分比”的方法。

提供第三种方法,返回已完成任务的实际结果。

答案 4 :(得分:1)

最简单的方法是让Web Service根据调用的进度更新数据库中的字段,然后创建一个查询该字段并返回值的Web服务。

答案 5 :(得分:0)

使Web服务返回某种任务ID或会话ID。使用该ID进行另一个Web方法查询,该ID返回所需的信息(%完成,文件列表,等等)。从客户端以某个时间间隔轮询此方法。

使用数据库来存储流程信息,如果您在Web服务的内存中执行此操作,这将无法在Web场环境中很好地扩展,因为任务可能在另一台服务器上运行,而不是您所在的服务器上运行轮询。

编辑:我刚看到另一个类似的答案,并对此发表评论。评论者是对的 - 您可以使用内存表来避免磁盘操作,但仍然使用单独的数据库服务器。