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