Invece di modding del codice generato automaticamente o avvolgere ogni chiamata nel codice duplicato, è possibile iniettare le intestazioni HTTP personalizzate con l'aggiunta di un messaggio personalizzato ispettore, è più facile di quanto sembri:
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));
}
}
E quando un'istanza la classe cliente si può semplicemente aggiungerlo come comportamento:
this.Endpoint.EndpointBehaviors.Add(new CustomAuthenticationBehaviour("Auth Token"));
questo renderà ogni chiamata di servizio in uscita per avere l'intestazione HTTP personalizzato.
fonte
2017-03-06 01:55:38
"non è possibile aggiungere intestazioni HTTP utilizzando il visual Studio proxy generato" È ancora il caso? – chaostheory
Posso aggiungere le intestazioni in questo modo ma come posso riaverle nel servizio WCF? – Joshy