6

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

4

6 回答 6

4

在服务器上编写一个单独的方法,您可以通过传递已安排的作业的 ID 来查询该方法,该方法返回 0-100(或 0.0 和 1.0,或其他)之间的近似值,表示它的距离。

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

您如何在后端实际完成监控很大程度上取决于您的流程是什么以及它是如何工作的。

于 2008-09-25T19:36:14.960 回答
2

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

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

于 2008-09-25T19:47:23.467 回答
2

您还可以使用 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...
}
于 2008-09-25T19:52:28.557 回答
1

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

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

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

于 2008-09-25T19:34:00.207 回答
1

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

于 2008-09-25T19:35:01.407 回答
0

使 Web 服务返回某种任务 ID 或会话 ID。使用该 ID 创建另一个 Web 方法来查询,它返回所需的信息(完成百分比、文件列表等)。每隔一段时间从客户端轮询此方法。

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

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

于 2008-09-25T19:43:24.867 回答