【问题标题】:What is the correct way to handle long running service operations with WCF hosted in IIS?使用 IIS 中托管的 WCF 处理长时间运行的服务操作的正确方法是什么?
【发布时间】:2012-06-20 17:12:00
【问题描述】:

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

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

我应该延长超时时间并进行一些 ajax 调用吗?我是否应该向我的数据库添加一个表,让长时间运行的操作更新这个数据库,并让 Web 界面每分钟轮询一次这个表?我不确定什么(如果有)普遍接受的最佳实践。

【问题讨论】:

  • 如果长时间运行的操作没有传输数据,那么也许你应该把它分解成一个异步处理器。因此,客户端会请求启动该作业,然后定期检查以获取响应或稍后再检查的消息。
  • @Noah,长时间运行的操作不会返回太多数据,直到它们完成,它们返回大约 50kb 的消息。
  • 如果您不传输数据,您绝对不应该长时间保持 http 连接打开,因此最好将其断开。 @Jim 提供了一个不错的例子。

标签: c# asp.net .net wcf


【解决方案1】:

看看这个

WCF Long Running Operations 可能还有其他选择,但它们几乎相同。您还可以在以下链接中提供一些推送通知(我假设没有返回数据)

WCF Push

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 您是否有理由推出自己的经理而不是使用 MSMQ?
    • 不是特别的。我从未使用过 MSMQ,正如我所说,这只是学校/COOP 的一个项目。我确信有很多改进设计的方法,但它对于我需要的东西来说已经足够简单了。该应用程序的主要目的是处理 WCF,虽然 MSMQ 会很有用,但它不是重点。
    • 在您的设计中,您的每个“工作主机”是否都向经理询问正在寻找工作?或者经理是否在需要时调用每项工作?
    • “工人主机”只是愚蠢的工人。他们有一组实现,这些实现取决于他们收到的服务调用。他们不会发起与其他任何事物的任何沟通。他们只在经理轮询更新等时响应状态更新......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多