WCF одинаковый IParameterInspector для всех операций над сервисом

Я реализовал пользовательский IParameterInspector, и я хочу, чтобы он выполнялся для каждой отдельной операции в моей службе.

Я понимаю, что реализации IParameterInspector могут использоваться только с реализациями IOperationBehavior, а реализация intern IOperationBehavior может использоваться только для украшения отдельных операций с использованием атрибута.

Кто-нибудь знает, есть ли способ зарегистрировать мой IParameterInspector на уровне службы, чтобы он мог выполнять все операции в службе?

Ответы

Ответ 1

Благодаря этому и нижележащему этому, я нашел то, что искал для.

IParameterInspector не должен находиться на уровне IOperationBehavior. Они могут быть на уровне IServiceBehavior. В методе ApplyDispatchBehavior уровня обслуживания вам необходимо выполнить все операции и назначить поведение инспектора.

Мой класс полностью...

[AttributeUsage(AttributeTargets.Class)]
public class ServiceLevelParameterInspectorAttribute : Attribute, IParameterInspector, IServiceBehavior
{
    public object BeforeCall(string operationName, object[] inputs)
    {
       // Inspect the parameters.
        return null;
    }

    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {
    }

    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
        {
            if (channelDispatcher == null)
            {
                continue;
            }

            foreach(var endPoint in channelDispatcher.Endpoints)
            {
                if (endPoint == null)
                {
                    continue;
                }

                foreach(var opertaion in endPoint.DispatchRuntime.Operations)
                {
                    opertaion.ParameterInspectors.Add(this);
                }
            }
        }
    }
}