gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:24:57 25 4
gpt4 key购买 nike

是否可以拦截 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com