1

如果在操作期间发生特定事情,我想添加服务器端重试行为。

自定义 IOperationInvoker 看起来很适合此功能,但是...

不幸的是,应该执行操作的实例已经创建/解析,因此为了正确实现重试逻辑,每个人都应该编写非常有限的无状态服务实现,有时最好有 InstanceContextMode.PerCall 模式和仅在请求生命周期内存在的状态。

是否有任何地方或可能强制 WCF 重新创建/解析服务并再次调用操作?

4

1 回答 1

0

自己实现重试逻辑并不容易。您将不得不处理许多问题,例如:

  1. 如果所有尝试都失败了怎么办?
  2. 尝试之间应该有间隔吗?
  3. 如果您的服务器在第一次和第二次尝试之间出现故障怎么办?
  4. 等等

幸运的是,有一个开箱即用的解决方案已经为您完成了所有工作。看看 MSMQ WCF 绑定。

  1. 如果您愿意,它会将您的合同对象放入死信队列,因此您可以轻松跟踪此类消息,甚至强制再次处理它们。
  2. 您可以设置尝试之间的间隔。因此,如果您的服务器停机 10 分钟,则并非所有尝试都会被击中。
  3. 您可以将其配置为耐用。它将消息存储在磁盘上,因此当您的服务器返回时,它将尝试再次处理消息。
  4. 等等 看看 MSMQ 绑定你会发现很多有用的特性。这是一篇关于WCF中排队的好文章

所以从长远来看,你的设计会是这样的:

客户端调用 -> MSMQ -> 服务

请注意,您根本不必对现有代码进行任何更改,您只需更改绑定配置并设置 MSMQ,这相当容易。

万一您不能直接与您的客户端使用 msmq 绑定,您总是可以使用一个特殊的服务器端服务,它只是将消息放入队列。所以设计将是:

客户端服务 -> HTTP -> QueueService(一种将消息放入队列的方法)-> MSMQ -> ProcessService

希望能帮助到你!

于 2013-09-18T15:00:37.507 回答