我使用IClientMessageInspector
登录/注销消息,但问题是我找不到如何从AfterReceivedReply
和BeforeSendRequest
获取操作名称。
我测试了以下内容:
if ((action = reply.Headers.Action.Split('/').LastOrDefault()) != null)
{
callInformation.Action = action;
callInformation.Address = reply.Headers.Action.Replace(action, "");
}
这在BeforeSendRequest
中运行良好,但在AfterReveivedReply
中,它会返回不同的内容,通常结尾是"Response"?
如何只获取这些方法中的操作名称
假设我的操作名为MyOperation
,OperationContract
属性表示action = "MyOpeation"
(拼写错误)。这样的结果是MyOpeation
将在BeforeSendRequest
中被提取,而AfterReceiveReply
将返回MyOperationResponse
。
因此,BeforeSendRequest
将提取属性中所述的操作,AfterReceiveReply
将提取真实的操作名称,但在末尾添加"响应"?
能够匹配输入/输出消息很重要,在我看来,唯一的方法是匹配操作名称,但如果这不可能,那么我看不到一个好的解决方案?
我在使用OperationContext.Current.IncomingMessageHeaders.Action时看到了解决方案,但在客户端执行此操作时OperationContect.Current为null。
根据您的问题,我认为您希望通过任何方式匹配输入/输出消息-该框架提供了以下功能:
在IClientMessageInspector.BeforeSendRequest
的实现中,您可以返回一个唯一的correlationState
,这反过来又允许您在IClientMessageInspector.AfterReceiveReply
的实现中关联回复消息,因为框架将用它作为第二个参数来调用您的实现。
编辑-根据以下评论:
如果你真的需要获得调用的操作/方法的名称,你可以通过实现IClientMessageFormatter.SerializeRequest
或IParameterInspector
来实现这一点-这将允许你记录用哪个方法调用了哪些参数,以及框架为它创建了什么Message对象