IEndpointBehavior ApplyClientBehavior方法在添加到Endpoint Behaviors的行为后未执行

时间:2018-05-01 15:40:40

标签: .net wcf soap

鉴于这两个类:

public class InspectorBehavior : IEndpointBehavior
{
    public MessageInspector MessageInspector;

    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters){}
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher){}
    public void Validate(ServiceEndpoint endpoint){}

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        MessageInspector = new MessageInspector();
        clientRuntime.MessageInspectors.Add(MessageInspector);
    }
}

public class MessageInspector : IClientMessageInspector
{
    public string LastRequestXML { get; private set; }
    public string LastResponseXML { get; private set; }
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
        LastResponseXML = reply.ToString();
    }

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
    {
        LastRequestXML = request.ToString();
        return request;
    }
}

这个行为初始化代码:

var requestInterceptor = new InspectorBehavior();
MYSoapClient.Endpoint.Behaviors.Add(requestInterceptor);

为什么永远不会执行ApplyClientBehavior方法而且MessageInspector始终为空?

当行为被添加到Endpoint Behavior集合时,不应该执行ApplyClientBehavior(我确认它是,而且requestInterceptor变量不为null)?

1 个答案:

答案 0 :(得分:0)

以我为例,我使用wcf来安装.net内核。

创建wcf客户端后设置EndpointBehaviors属性时,未调用ApplyClientBehavior方法。

对我来说,诀窍是:我必须在wcf客户端构造函数中设置EndpointBehaviors属性。我无法说出这样做能达到目的的原因,这对我来说根本没有意义,但确实有效。

如果需要,您可以创建一个新的部分类并具有一个新的构造函数来注册此行为。如果您需要重新生成服务合同,这可能会很有用。

希望这可以帮助其他人。