¿Hay manera de inspeccionar la llamada al método wcf? Me refiero a cualquier cosa igual a HttpModule en asp.net.Enganchando a la tubería wcf
Quiero ejecutar un método antes de cualquier llamada a un método.
¿Hay manera de inspeccionar la llamada al método wcf? Me refiero a cualquier cosa igual a HttpModule en asp.net.Enganchando a la tubería wcf
Quiero ejecutar un método antes de cualquier llamada a un método.
WCF tiene una arquitectura muy extensible. Es posible interceptar y personalizar muchas funcionalidades de WCF para que hagan lo suyo.
Para su caso, deberá escribir el Servicio o Comportamiento del punto final adecuado. El proceso entre la recepción de un mensaje de los canales de transporte y la invocación de su método de servicio se denomina despacho. WCF usa un conjunto de Comportamientos para hacer el despacho. Puede proporcionar su propio Comportamiento para inspeccionar las llamadas al método.
Este artículo proporciona una excelente visión general y ejemplos - http://msdn.microsoft.com/en-us/magazine/cc163302.aspx
También sugeriría que pasar por este WCF Introducción a la arquitectura http://msdn.microsoft.com/en-us/library/aa480210.aspx
Depende de lo que desea comprobar o modificar en el mensaje en qué nivel. Si desea modificar algo en el nivel de Codificación, puede optar por Codificador de mensajes personalizados, si es antes de solicitar la deserialización o antes de enviar una respuesta al cliente, use el Inspector de mensajes personalizados.
HTH.
El IOperationInvoker
podría haber sido lo que estaba buscando:
public class MyOperationInvoker : IOperationInvoker
{
IOperationInvoker originalInvoker;
public MyOperationInvoker(IOperationInvoker originalInvoker)
{
this.originalInvoker = originalInvoker;
}
public bool IsSynchronous { get { return originalInvoker.IsSynchronous; } }
public object[] AllocateInputs() { return originalInvoker.AllocateInputs(); }
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
//Do stuff before call
var res = this.originalInvoker.Invoke(instance, inputs, out outputs);
//stuff after call
return res;
}
public IAsyncResult InvokeBegin(object instance, object[] inputs,
AsyncCallback callback, object state)
{
//Do stuff before async call
var res = this.originalInvoker.InvokeBegin(instance, inputs, callback, state);
return res;
}
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
var res = this.InvokeEnd(instance, out outputs, result);
//Do stuff after async call
return res;
}
}
Implementado como un atributo para todas las operaciones en el servicio:
public class MyBehaviorAttribute : Attribute, IServiceBehavior, IOperationBehavior
{
//IOperationBehavior
public void ApplyDispatchBehavior(OperationDescription operationDescription,
DispatchOperation dispatchOperation)
{
dispatchOperation.Invoker = new MyOperationInvoker(dispatchOperation.Invoker);
}
public void AddBindingParameters(OperationDescription operationDescription,
BindingParameterCollection bindingParameters) { /*Do nothing*/ }
public void ApplyClientBehavior(OperationDescription operationDescription,
ClientOperation clientOperation) { /*Do nothing*/ }
public void Validate(OperationDescription operationDescription) { /*Do nothing*/ }
//IServiceBehavior
public void Validate(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase) { /*Do nothing*/ }
public void AddBindingParameters(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase,
Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters) { /*Do nothing*/ }
public void ApplyDispatchBehavior(ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
foreach (ServiceEndpoint endpoint in serviceHostBase.Description.Endpoints)
{
foreach (var operation in endpoint.Contract.Operations)
{
operation.Behaviors.Add(this);
}
}
}
Y el servicio:
[MyBehavior]
public class HelloService : IHelloService
{
...
}
El primer enlace está roto. –