在消息检查器中获取操作名称

本文关键字:操作 获取 消息 检查 | 更新日期: 2023-09-27 18:29:54

我使用IClientMessageInspector登录/注销消息,但问题是我找不到如何从AfterReceivedReplyBeforeSendRequest获取操作名称。

我测试了以下内容:

if ((action = reply.Headers.Action.Split('/').LastOrDefault()) != null)
{
   callInformation.Action = action;
   callInformation.Address = reply.Headers.Action.Replace(action, "");
}

这在BeforeSendRequest中运行良好,但在AfterReveivedReply中,它会返回不同的内容,通常结尾是"Response"

如何只获取这些方法中的操作名称

假设我的操作名为MyOperationOperationContract属性表示action = "MyOpeation"(拼写错误)。这样的结果是MyOpeation将在BeforeSendRequest中被提取,而AfterReceiveReply将返回MyOperationResponse

因此,BeforeSendRequest将提取属性中所述的操作,AfterReceiveReply将提取真实的操作名称,但在末尾添加"响应"

能够匹配输入/输出消息很重要,在我看来,唯一的方法是匹配操作名称,但如果这不可能,那么我看不到一个好的解决方案?

我在使用OperationContext.Current.IncomingMessageHeaders.Action时看到了解决方案,但在客户端执行此操作时OperationContect.Current为null。

在消息检查器中获取操作名称

根据您的问题,我认为您希望通过任何方式匹配输入/输出消息-该框架提供了以下功能:

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

编辑-根据以下评论:

如果你真的需要获得调用的操作/方法的名称,你可以通过实现IClientMessageFormatter.SerializeRequestIParameterInspector来实现这一点-这将允许你记录用哪个方法调用了哪些参数,以及框架为它创建了什么Message对象