Dieses Beispiel fügt den Header über einen MessageInspector und EndpointBehavior ein, womit der Client sehr flexibel eingesetzt werden kann.
Folgende Klassen sind erforderlich.
public class HttpBasicAuthMessageInspector : IClientMessageInspector
{
private string BasicAuth = "";
public HttpBasicAuthMessageInspector(string ThisBasicAuth)
{
BasicAuth = ThisBasicAuth;
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
public object BeforeSendRequest(ref Message request, System.ServiceModel.IClientChannel channel)
{
HttpRequestMessageProperty HttpRequestMessage;
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out object HttpRequestMessageObject))
{
HttpRequestMessage = HttpRequestMessageObject as HttpRequestMessageProperty;
if (string.IsNullOrEmpty(HttpRequestMessage.Headers[HttpRequestHeader.Authorization]))
HttpRequestMessage.Headers[HttpRequestHeader.Authorization] = BasicAuth;
}
else
{
HttpRequestMessage = new HttpRequestMessageProperty();
HttpRequestMessage.Headers.Add(HttpRequestHeader.Authorization, BasicAuth);
request.Properties.Add(HttpRequestMessageProperty.Name, HttpRequestMessage);
}
return null;
}
}
public class HttpBasicAuthEndpointBehavior : IEndpointBehavior
{
private string BasicAuth = "";
public HttpBasicAuthEndpointBehavior(string ThisBasicAuth)
{
BasicAuth = ThisBasicAuth;
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
HttpBasicAuthMessageInspector Inspector = new HttpBasicAuthMessageInspector(BasicAuth);
clientRuntime.ClientMessageInspectors.Add(Inspector);
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
Für die Verwendung wird dem Client dann nur noch das Verhalten hinzugefügt.
string BasicAuth = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(Client.ClientCredentials.UserName.UserName + ":" + Client.ClientCredentials.UserName.Password));
Client.Endpoint.EndpointBehaviors.Add(new HttpBasicAuthEndpointBehavior(BasicAuth));
Dieser Ansatz eignet sich auch für andere Header, die standardmäßig einem Client hinzugefügt werden sollen.