【问题标题】:setting timeout for a long running WCF Service为长时间运行的 WCF 服务设置超时
【发布时间】:2023-06-21 12:02:02
【问题描述】:

我有一个 WCF 服务方法,它需要两个多小时才能执行(运行一些报告)。无论花费多少时间,我如何确保它不会超时?我认为 WCF 配置中有很多超时设置,我不确定哪一个与我相关。对于 ASMX webservices,有一个选项可以指定无限超时设置,WCF 是否有类似的设置?我是否还需要为此更改任何 IIS 设置(WCF 服务托管在 IIS 中),例如回收工作进程、空闲超时等?

【问题讨论】:

    标签: timeout wcf


    【解决方案1】:

    这是对网络服务的滥用。不要这样做。

    相反,让 Web 服务启动长时间运行的操作,在单独的进程中运行。如果客户需要知道报告何时完成,则让“单独的过程”跟踪报告的创建,并在报告完成时记录下来。客户端可以调用 Web 服务来检查该状态。

    您真的不希望依赖 HTTP 连接保持打开数小时。这是一个网络。事情发生在网络上。坏事。

    【讨论】:

    • 是的,我认为你是对的,我正在尝试在 Windows 服务中托管 WCF 服务,看看是否可以解决超时问题。
    【解决方案2】:

    您是否考虑过使用回调?您的客户端发送一个请求,然后等待来自服务器的通知何时完成?这可能需要对客户端进行更改,但这样一来,您的服务就可以“敲响链条”并在报告完成时告诉客户端。

    求助:http://idunno.org/archive/2008/05/29/wcf-callbacks-a-beginners-guide.aspx

    WCF 超时: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/84551e45-19a2-4d0d-bcc0-516a4041943d/

    您还应该考虑客户端的超时。 (binding.OpenTimeout、ReceiveTimeout、CloseTimeout 等)

    另一种选择是将 WCF 托管在 Windows 服务中,这可以简化您的情况,因为它从等式中删除了 IIS:

    http://msdn.microsoft.com/en-us/library/ms733069.aspx

    或者,使用单向 WCF 调用怎么样?这样,调用将在发送请求后尽快返回给客户端。

    Need sample fire and forget async call to WCF service

    【讨论】:

    • 是的,我正在尝试在 Windows 服务中托管 WCF 服务,我认为回调在这种情况下不合适,因为它是一个长时间运行的任务,用户不能等待这样的很长一段时间才能得到结果的通知。这是一个“一劳永逸”的电话,用户只需检查网络上的文件系统以查看是否已创建报告。最初我反对使用 Windows 服务,因为安装和卸载的麻烦,所以我尝试使用 IIS,但它会导致超时问题。
    • 在 WCF 中使用单向调用怎么样? *.com/questions/774648/…
    【解决方案3】:

    考虑改为创建一个WCF workflow service(使用 WF)。这些是专门为处理长时间运行的进程而设计的,尤其是在您使用持久性的情况下。

    【讨论】:

    • 感谢您的回复。这不是一个工作流,它只是一个需要很长时间才能执行的任务,因此使用 WF 可能会有点过头了。