如何添加重试以调用Web服务?

时间:2014-06-23 07:44:26

标签: .net web-services wcf soap

我有一个应用程序调用使用wsHttpBinding的Web服务。 我需要在连接超时等情况下对Web服务调用实现某种重试功能。最好的方法是什么?

我已经阅读过WS-ReliableMessaging,但这不是Web服务的发布者必须在服务上实现的东西,而不是我在客户端需要做的事情吗?

1 个答案:

答案 0 :(得分:2)

我假设您的调用是写操作,因此您需要确保写入成功。

您是对的,WS-ReliableMessaging标准确实需要在服务端实现。

您的主要问题是您可能遇到不同类别的失败;重试失败和非重试失败,您的客户必须知道哪种失败。

可重试的失败示例

  1. 由于间歇性网络可用性导致的故障
  2. 由于数据库死锁导致的失败
  3. 服务超时(仅当服务操作为idempotent时)
  4. 非重试失败示例

    1. 呼叫中数据错误的问题(没有点重试,每次都会失败)
    2. 客户端频道问题
    3. Bug引入服务
    4. 服务超时(当服务操作是非幂等的时)
    5. 如果服务公开fault contracts,确定您的呼叫失败的原因会变得更加简单,如果失败了,您将被强制捕获并查询服务上引发的类型为SoapException的异常,并且希望包含原始异常详细信息(默认情况下为they are not)。其他类型的失败将以various WCF channel exceptions的形式提交给您,如果未处理,所有这些都将中止客户端通道(包括任何会话)。

      关于超时的具体问题特别棘手 - 超时可能有多种原因,但基本上你不能假设你的呼叫失败了 - 呼叫可能已经提交但是直接客户端通道超时才能响应发送。在这种情况下,如果您可以使用相同的数据多次调用服务而没有副作用,则只能重试。

      如果服务操作无法如上所述执行,最佳解决方案是对您刚尝试提交的数据执行查找。如果调用成功,则数据应该在那里,否则您可以安全地重试。