WCF与服务上的所有操作相同的IParameterInspector

时间:2010-11-10 11:17:59

标签: wcf extensibility

我已经实现了自定义IParameterInspector,我想让它在我的服务上执行每一项操作。

我的理解是IParameterInspector实现只能用于IOperationBehavior实现,而实习IOperationBehavior实现只能用于使用属性修饰单个操作。

有没有人知道我是否可以在服务级别注册我的IParameterInspector,以便它可以为服务中的所有操作执行?

1 个答案:

答案 0 :(得分:14)

感谢this和后续this,我找到了我想要的东西。

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