我有一个应用程序调用使用 wsHttpBinding 的 Web 服务。
我需要在连接超时等情况下对 Web 服务调用实现某种重试功能。执行此操作的最佳方法是什么?
我已经阅读过有关 WS-ReliableMessaging 的内容,但这不是 Web 服务的发布者必须在服务上实现的内容,而不是我必须在客户端执行的内容吗?
我假设您的调用是写入操作,因此您需要确保写入成功。
你是对的,WS-ReliableMessaging 标准确实需要在服务端实现。
您的主要问题是您可能会遇到不同类别的故障;可重试的故障和不可重试的故障,您的客户端必须知道哪一种是哪一种。
可重试的失败示例
- 由于网络可用性间歇性而失败
- 数据库死锁导致失败
- 服务超时(仅当服务操作幂等的 http://www.servicedesignpatterns.com/WebServiceInfrastructures/IdempotentRetry)
不可重试的失败示例
- 调用中数据错误的问题(没有必要重试,因为每次都会失败)
- 客户渠道问题
- 服务引入错误
- 服务超时(当服务操作非幂等时)
如果服务公开,那么确定调用失败的原因将会变得更加简单过错合约 http://msdn.microsoft.com/en-us/library/ms752208%28v=vs.110%29.aspx,如果失败,您将被迫捕获并询问服务上抛出的异常类型肥皂异常 http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapexception%28v=vs.110%29.aspx,并希望包含原始异常详细信息(默认情况下他们不是 http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicedebugbehavior.includeexceptiondetailinfaults%28v=vs.110%29.aspx)。其他类型的失败将向您提出各种WCF通道异常 http://blogs.msdn.com/b/pedram/archive/2008/01/25/wcf-error-handling-and-some-best-practices.aspx,如果未处理,所有这些都将中止客户端通道(包括任何会话)。
您关于超时的具体问题特别棘手 - 超时可能有多种原因,但基本上您不能假设您的呼叫失败 - 呼叫很可能已提交,但在发送响应之前客户端通道直接超时。在这种情况下,只有在可以的情况下重试才是安全的使用相同的数据多次调用服务,没有副作用.
如果服务操作无法按上述方式执行,最佳解决方案是对您刚刚尝试提交的数据执行查找。如果调用成功,数据应该在那里,否则您可以安全地重试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)