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);
}
}
}
}
}
Un poco viejo, pero ¿por qué las llamadas en el código de continuar? – itchi
@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