c# - 根据拦截和返回值自动重试客户端 WCF 调用

标签 c# wcf

是否可以拦截 WCF 调用的结果并重试该操作?

例如,操作的返回值可能包含一个状态代码,指示我传递给原始调用的 session token 已过期。在这种情况下,我可以检索新的 session token 并使用新的 session token 重试调用。

是否可以通过使用返回值的 WCF 拦截、检查它,然后对操作调用者完全透明地重试调用来执行此重试操作?

我已经知道如何使用 IParameterInspector 检查调用,但目前还没有重试调用的内置方法。

我正在寻找一种使用纯拦截的方法,以便它对客户端完全透明。

最佳答案

假设您希望在客户端发生这种情况,那么您可以使用 IClientMessageInspector - 如果你想在服务器端实现它,你可以创建一个 IDispatchMessageInspector .

通过实现 IClientMessageInspector,您可以检查 AfterReceiveReply event 中的结果如果需要重试,那么您可以启动重试...当调用返回时,您只需“覆盖”让您用新的重试的结果...这样操作调用者甚至不会注意到任何东西(除了调用有时需要更长的时间)。

尽管您在重试功能的实现中必须小心(可能的重入问题需要适当处理)。

一些示例代码(没有重试本身)参见 http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx

编辑 - 根据评论:

如何实现重试操作取决于几个方面。

基本上,您需要将调用关联到请求消息,将请求消息关联到重播消息。

实现此目的的一种方法是实现 IClientMessageFormatter.SerializeRequest或者 IParameterInspector - 这将允许您记录使用哪些参数调用了哪些方法以及框架为其创建了哪些 Message 对象。

通过实现 IClientMessageInspector.BeforeSendRequest您可以分配一个唯一的 correlationState,它又允许您在 IClientMessageInspector.AfterReceiveReply 的实现中关联回复消息因为框架将使用它作为第二个参数来调用您的实现。

从那里您可以使用反射重试调用(所有需要的信息都可用,因为您在 IClientMessageFormatter 和/或 IParameterInspector 中记录了类型、方法和参数> 实现)并用新的回复覆盖回复消息。

另一个(也许更容易)的选择是实现一个自定义的 WCF 客户端类并为调用者提供它......调用的操作。

编辑 2 - 根据评论:

在实现 IClientMessageInspector 时,您还必须实现 IEndpointBehavior反过来有一个方法 ApplyClientBehavior它由 WCF 运行时调用以添加您的 IClientMessageInspector。在该方法中,您实例化您的实现,该实现在构造函数中接受一个参数,而该参数又是 endpoint.Contract.ContractType。或 clientRuntime.ContractClientType .您将此类型存储在检查器实例中...有关如何对此进行编码的提示,请参见例如 http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/19500d14-78b7-4356-b817-fcc9abc2afcf/

关于c# - 根据拦截和返回值自动重试客户端 WCF 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8022640/

相关文章:

c# - 不使用证书的 wsHttpBinding 消息级安全性?

ajax - 使用 gzip 编码时,WCF 服务返回不正确的 Content-Length

wcf - 在 WCF 中运行重复性后台任务的好方法?

c# - EPPLUS 清除一系列单元格的内容

c# - 添加安装程序说服务名称包含无效字符、为空或太长

c# - ServiceStack.Redis 无法解析

c# - 没有参数的 WebGet 或 UriTemplate 失败

c# - 确保属性不能返回 null

c# - 覆盖 SaveChanges() 的最佳方法

asp.net-mvc - ASP.NET MVC 4 到 WCF 数据服务