【问题标题】:WCF timeout handlingWCF 超时处理
【发布时间】:2016-11-16 03:02:48
【问题描述】:

我们目前正在开发一种软​​件解决方案,该解决方案具有一个客户端和它使用的许多 WCF 服务。我们遇到的问题是 WCF 服务在一段时间不活动后超时。据我了解,有两种方法可以解决这个问题:

  1. 增加超时(据我了解,通常不建议这样做。例如,将超时设置为无限/周被认为是不好的做法)
  2. 定期从客户端 ping WCF 服务(我不确定我是否是他的忠实粉丝,因为它会添加冗余的定期调用)
  3. 处理超时问题并尝试重新连接(这很慢并且需要大量手动代码)
  4. 可靠的会话 - 一些消息来源提到这是内置的 WCF ping 和消息可靠性机制,但其他消息来源提到这仍然会超时。

解决此问题的推荐/最佳方法是什么?有这方面的官方阅读材料吗?我自己找不到这么多信息

谢谢!

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    如我所见,您必须结合使用您所说的观点。

    1. 你说得对,增加超时是不好的做法,会给你带来很多问题。
    2. 如果您不想使用可靠会话,那么 Ping 是保持连接的唯一适用方式。
    3. 你需要处理这些事情,无论是超时、连接丢失还是抛出异常。您的连接可能出现故障的可能性有很多。
    4. 可靠会话是一种不执行 ping 的好方法,但从技术上讲,它的作用几乎相同。 WCF 会自动发送“我仍然在这里”请求。

    结论是,您需要第 3 点和第 2 点或第 4 点。要减少第 3 点的手动代码,您可以在 ServiceClient 周围使用代理或包装器,如果旧连接是在请求期间出现故障。第 4 点很容易实现,因为您只需要在配置中添加一些小的绑定即可。而且流量开销并没有那么大。第2点是最昂贵的方式,你需要处理一个只ping服务器并且服务需要扩展的线程/任务。但正如您之前所说,Reliable Sessions 可能会失败,Pings 应该让您安全。

    【讨论】:

    • 我猜这听起来是对的。感谢您分享您的意见 :) 您自己对 WCF 有很多经验吗?你最终实现了类似的模式吗?
    • @Ross 是的,我们在 wcf 中编写了一个动态双工服务作为几个内部项目的基础。我的回答反映了我过去 3 年在 wcf 中的所有经验。我们实现了第 3 点和第 4 点,但可靠会话并不像应有的那样可靠;)所以我们实现了 Ping,从那以后,一切运行完美。
    • 很高兴听到!非常感谢您分享您的经验:)
    • 我在 Simplex 服务超时方面取得了一些进展——由于超时和周期性 ping 的增加,事情现在没有超时,如果/当他们这样做时,它们会自动重新连接!我现在遇到的问题是从双工服务的角度处理同样的问题。几乎是从服务重新连接回客户端通道,这似乎是不可能的,因为无法从订阅中存储 OperationContext.Current 以供以后重新连接。对此有什么想法吗?提前致谢!
    【解决方案2】:

    您应该问问自己您的 WCF 端点在做什么?您的命令设置方式是最优的吗? 也许最好让需要很长时间的端点基于允许快速查询而不是等待端点操作的结果的轮询系统。 您还应该将数据传输视为一个可能的问题。您传回的数据量是否很多?

    要获得更明确的答案,我们需要更多地了解特定端点以及该服务的任何其他职责。

    【讨论】:

    • 我们有几个不同的 WCF 服务用于不同的目的。有些是单工的,有些是双工的。它们都执行快速操作(最多几秒钟,大多数更快)。问题是其中一些是间歇性使用的,因此对这些服务的请求之间可能会有几个小时,我们希望在这些服务中保持运行,而不必每次都启动它们,这意味着延迟。跨度>
    • 让两个进程运行应该不会有问题。一段时间后尝试调用调用时,您是否尝试过在两个进程之间重新建立连接?
    • 不小心按了“输入”。如果您为每个服务命令重新建立连接,则可以使连接问题变得更容易。您的程序应该具有它们正在运行的循环,以便能够根据请求回答端点命令。不需要每次都启动进程。他们为什么要下来?如果是由于超时,那么这是一个命令在服务之间花费的时间太长的问题。
    • 感谢您的回复!澄清一下 - 进程正在运行,但是 WCF 调用会导致“CommunicationObjectFaultedException”,它只发生在 5-10 分钟不活动之后,所以这就是为什么我们认为这是 WCF 超时(这似乎是一致的以及我发现的一些文档位)。我们可以尝试重新连接,但是有数百个不同的调用,这将变得非常手动且容易出错。
    • 我们想到的是一个单一的改变——要么是服务配置,要么是为每个服务添加一个 Ping() 方法并定期 ping 它们。问题是这些看起来都不是……很棒:/
    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2021-03-01
    • 2023-03-24
    • 2016-11-22
    相关资源
    最近更新 更多