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

有帮助吗?

解决方案

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

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

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

其他提示

我认为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...
}

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top