在Message Inspector中获取操作名称?

Ban*_*hee 5 .net c# wcf action

我使用IClientMessageInspector登录/注销消息,但问题是我无法找到如何从AfterReceivedReply和获取操作名称BeforeSendRequest.

我测试了以下内容:

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

这样可以正常工作,BeforeSendRequest但是AfterReveivedReply它会返回不同的东西,通常最后带有"响应"

我如何仅在这些方法中获取操作名称?

比如说,我的操作已命名MyOperation,OperationContract属性表示action = "MyOpeation"(拼写错误).这样的结果是在将返回时MyOpeation将被提取出来.BeforeSendRequestAfterReceiveReplyMyOperationResponse

因此,BeforeSendRequest将在属性中AfterReceiveReply提取所述操作,并将提取实际操作名称,但最后添加"响应"

能够匹配输入/输出消息以及执行此操作的唯一方法非常重要,因为我看到它是匹配操作名称,但如果不可能,那么我没有看到一个很好的解决方案吗?

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

Yah*_*hia 3

从你的问题来看,我假设你想通过任何方式匹配输入/输出消息 - 框架为此提供了:

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

编辑 - 根据以下评论:

如果您确实需要获取所调用的操作/方法的名称,您可以通过实现IClientMessageFormatter.SerializeRequestOR来做到这IParameterInspector一点 - 这将允许您记录调用了哪个方法以及哪些参数以及框架为其创建的 Message 对象。