我们如何衡量Web服务调用的进度?

时间:2020-03-06 14:44:38  来源:igfitidea点击:

我有一个ASP.NET Web服务,它可以进行一些繁重的工作,例如某些文件操作,或者从一堆水晶报表中生成Excel Sheets。我不想被调用此Web服务而被阻止,所以我想使Web服务调用异步。另外,我想从网页上调用此Web服务,并希望有一种机制可以让我不断轮询服务器,以便我可以在屏幕上显示一些进度指示器,例如文件的数量。已处理。请注意,我不希望在Web方法调用完成时收到通知,而是希望获得实时进度状态。我该怎么办?

解决方案

让最初的"开始生成报告" Web服务调用在某些任务池中创建一个任务,并返回调用者该任务的ID。

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

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

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

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

例如。以REST风格,我们可以向http:// yourserver.com / app / jobstatus / 4133 /发出GET请求,该请求将返回一个简单的'52'作为text / plain。然后,我们只需要每隔一秒(秒?两秒?十秒?)查询一次,以查看距离有多远。

在后端上实际完成监视的方式很大程度上取决于过程及其工作方式。

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

使用数据库存储过程信息,如果我们在Web服务的内存中执行此操作,则该信息在Web场环境中无法很好地扩展,因为可能会发生任务在要轮询的服务器上的另一台服务器上运行。

编辑:我刚刚看到另一个类似的答案,并对其进行评论。该注释器是正确的,我们可以使用内存表来避免磁盘操作,但仍使用单独的数据库服务器。

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

请尝试使用SOAP扩展。它实现了一个事件驱动的模型。请参阅在MSDN上将进度条添加到Web服务客户端应用程序。

我们还可以使用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...
}