【问题标题】:Implementing retry pattern for WCF call transient exceptions为 WCF 调用瞬态异常实现重试模式
【发布时间】:2015-12-23 14:08:34
【问题描述】:

我有一个非常简单的 WCF SOAP 服务,它在每次调用时对 DB 进行一些更改并返回一些响应。我还使用 ServiceChannel 从我的客户端代码中调用它。

我想确保我的客户端代码不会在服务太忙时失败,因此实现了Retry pattern 以在捕获到异常时重试服务调用。但是,如果异常是由 WCF 服务器端的 my 代码引起的(如果它与连接无关,或者无论如何执行了任何 OperationContract 代码(超时不'不意味着它不是,对吧?))。

所以我只想重试

  1. 我已发送请求
  2. 遇到异常
  3. 没有我的 OperationContract 方法中的服务器端代码被执行

Microsoft 文章(上面的链接)几乎没有关于瞬态 的确切异常类型的信息。我应该使用哪些异常类型来准确捕获我需要的内容?或者我应该如何过滤它们?

【问题讨论】:

  • 我不确定如果 none 的服务器代码被执行,你是否能知道客户端。如果数据包到达服务器但客户端没有得到响应,那么绝对无法了解服务器端发生了什么。因此,如果出现任何异常,重试是有意义的,只需确保您正确处理回复,例如通过在消息中包含唯一 id 并将传入 id 与先前存储的 id 列表进行比较。
  • 我认为您提到的文章确实涵盖了瞬态异常的处理。你有没有看IsTransient(Exception ex) 方法定义。 WebExceptionStatus.ConnectionClosed, WebExceptionStatus.Timeout, WebExceptionStatus.RequestCanceled }. Contains(webException.Status

标签: c# .net wcf exception resiliency


【解决方案1】:

在您的 WCF 服务实现中,在您的操作合同中捕获在整个代码执行过程中发生的异常,并返回特定的 FaultException 以向您的客户端发出您的服务端代码已运行的信号。可以放置一个特殊的故障代码或使用预定义的子字符串启动您的故障异常消息。在您的客户端,一旦您捕获到故障异常,请检查子字符串是否存在(或您在服务代码上设置的特定故障代码),如果这些存在,则意味着您的服务端代码已经运行,否则您不需要重试你可以重试。您还可以捕获其他异常类型并重试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多