如何在托管于IIS的WCF中正确处理长时间运行的服务操作?

10

我正在构建一个WCF服务,该服务将公开多个操作,由于需要HTTPS端点,它将在IIS中运行。大多数操作都将在几秒钟或更短的时间内执行;然而,其中一两个操作将需要5-90分钟。

这个服务的主要使用者是一个ASP.NET MVC应用程序;处理这种情况的正确方法是什么?

我应该增加超时时间并进行一些ajax调用吗?我应该向我的数据库添加一个表格,并让长时间运行的操作更新这个数据库,让Web界面每隔一分钟轮询这个表格吗?我不确定是否有通常被接受的最佳做法。


如果长时间运行的操作没有传输数据,那么也许你应该将其拆分为异步处理器。这样客户端就会请求启动作业,然后定期返回以获取响应或消息,提示稍后再检查。 - Noah
1
@Noah,长时间运行的操作在完成之前不会返回太多数据,直到它们完成后,才会返回大约50kb的消息。 - Nate
如果你不传输数据,那么绝对不应该保持http连接那么长时间,所以最好将其分开。@Jim提供了一个不错的例子。 - Noah
2个回答

1

我在我的高级项目中写了类似的东西,基本上是一个作业调度框架。

  1. 我选择将“作业”的“状态”存储在数据库中。
  2. 我编写了一个管理器Windows服务,实现了WCF客户端(代理)。
  3. 我编写了一个实现了我的“工作主机”的WCF服务。

管理器服务将从数据库读取队列,并将工作分配给所有我的“工作主机”。我之所以让Windows服务执行此任务,而不是直接让UI与工作主机通信,是因为它为整个过程提供了额外的控制层面。

我不喜欢让“网络电缆”从我的工作主机中拔出,并且再也没有从这个特定作业得到状态更新的想法。因此,Windows服务使我能够不断监视WCF工作主机的进度,如果发生连接错误(或其他意外情况),我可以将状态更新为失败。因此,没有孤立的作业。


你自己编写管理器而不使用MSMQ,有什么原因吗? - Nate
并不是特别需要。我从未使用过MSMQ,正如我所说,这只是一个学校/实习项目。我相信有很多方法可以改进设计,但对于我所需的内容来说,它已经足够简单了。该应用程序的主要目的是掌握WCF,并且尽管MSMQ可能很有用,但它并不是重点。 - Localghost
在您的设计中,每个“工作者主机”是否查询经理以寻找工作?还是经理在需要时调用每个工作? - Nate
"工作主机"只是一些愚蠢的工作者。它们有一组实现,根据接收到的服务调用来调用这些实现。它们不会主动与其他任何东西进行通信。只有在管理器轮询更新时,它们才会以状态更新的方式进行响应等等... - Localghost

0

看一下这个

WCF长时间运行的操作 可能还有其他选项,但它们几乎相同。您也可以考虑使用一些推送通知(我假设没有返回数据),如以下链接之一

WCF推送


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接