En lugar de modding el código generado automáticamente o envolviendo cada llamada en código duplicado, se puede inyectar cabeceras HTTP personalizados mediante la adición de un inspector de mensaje personalizado, es más fácil de lo que parece:
public class CustomMessageInspector : IClientMessageInspector
{
readonly string _authToken;
public CustomMessageInspector(string authToken)
{
_authToken = authToken;
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var reqMsgProperty = new HttpRequestMessageProperty();
reqMsgProperty.Headers.Add("Auth-Token", _authToken);
request.Properties[HttpRequestMessageProperty.Name] = reqMsgProperty;
return null;
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{ }
}
public class CustomAuthenticationBehaviour : IEndpointBehavior
{
readonly string _authToken;
public CustomAuthenticationBehaviour (string authToken)
{
_authToken = authToken;
}
public void Validate(ServiceEndpoint endpoint)
{ }
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{ }
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{ }
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(new CustomMessageInspector(_authToken));
}
}
Y cuando instanciar su clase de cliente simplemente puede añadirlo como un comportamiento:
this.Endpoint.EndpointBehaviors.Add(new CustomAuthenticationBehaviour("Auth Token"));
Esto hará que cada llamada de servicio de salida para que su encabezado HTTP personalizado.
"no puede añadir cabeceras HTTP utilizando el estudio visual proxy generado" ¿sigue siendo el caso? – chaostheory
Puedo agregar encabezados como este, pero ¿cómo los vuelvo a obtener en el Servicio WCF? – Joshy