WCF Тот же IParameterInspector для всех операций над службой - PullRequest
13 голосов
/ 10 ноября 2010

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

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

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

1 Ответ

14 голосов
/ 10 ноября 2010

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

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);
                }
            }
        }
    }
}
...