WCF服务的所有操作都使用同一个IParameterInspector

13

我已经实现了一个自定义的IParameterInspector,并且希望它可以在我的服务的每个操作中执行。

我的理解是IParameterInspector实现只能与IOperationBehavior实现一起使用,并且内部IOperationBehavior实现只能用于使用属性装饰单个操作。

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

1个回答

14

感谢这篇文章以及随后的这篇文章,我找到了我需要的内容。

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

1
@itchi 现在更老了,但我猜是因为“该集合包含ChannelDispatcherBase对象(而不仅是ChannelDispatcher的实例),因为它还被那些想保留Windows Communication Foundation (WCF)编程模型但替换系统提供运行时的开发人员使用”。看起来代码可能会触发无效转换异常。最好使用keep ChannelDispatcherBase并使用"as"运算符。 - trydis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接