2010-11-10 10 views
13

He implementado un IParameterInspector personalizado y quiero que se ejecute para cada operación en mi servicio.WCF Mismo IParameterInspector para todas las operaciones en un servicio

Mi comprensión es que las implementaciones IParameterInspector solo se pueden usar con las implementaciones IOperationBehavior, y que la implementación IOperationBehavior del interno solo se puede usar para decorar operaciones individuales utilizando un atributo.

¿Alguien sabe si hay una forma en que puedo registrar mi IParameterInspector en un nivel de servicio para que pueda ejecutarse para todas las operaciones en el servicio?

Respuesta

14

Gracias a this y subsiguientemente this, encontré lo que estaba buscando.

IParameterInspector no necesita estar en el nivel IOperationBehavior. Pueden estar en el nivel IServiceBehavior. En el método de nivel de servicio ApplyDispatchBehavior, debe recorrer todas sus operaciones y asignar el comportamiento del inspector.

Mi clase en su totalidad ...

[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); 
       } 
      } 
     } 
    } 
} 
+2

Un poco viejo, pero ¿por qué las llamadas en el código de continuar? – itchi

+1

@itchi Aún más antiguo ahora, pero supongo porque "La colección contiene objetos ChannelDispatcherBase (y no solo instancias de ChannelDispatcher) porque también la utilizan los desarrolladores que desean mantener el modelo de programación de Windows Communication Foundation (WCF) pero reemplazan el tiempo de ejecución proporcionado por el sistema ". Parece que el código podría desencadenar una excepción de conversión no válida. Sería mejor usar keep ChannelDispatcherBase y usar el operador "as". – trydis

Cuestiones relacionadas