Questo post mi serve come memento, e per condividre con altri che possono avere lo stesso problema: consumare da C# un web service SOAP con autenticazione Pre-Emptive tipo basic.

Poche parole su SOAP: è un protocollo utilizzato per lo scambio di messaggi tra software diversi. Utilizzare un tale servizio da C# è molto semplice: basta aggiungere da Visual Studio un reference fornendo i dati identificativi.... e voilà.. il gioco è fatto.. o quasi.

Esistono molti modi per autenticarsi al servizio (se richiesto, come lo è nella maggior parte delle volte): in generale è abbastanza rognoso trovare il metodo e il codice relativo codice corretto, sopratutto se si esce dal mondo prettamente WCF.

Spesso basta agire sul file config, agendo sui vari nodi di bindings, ma spesso non basta.

In questo caso ho dovuto aggiungere all'header della richiesta una voce Authorization formattata ad hoc.

 Per fare questo ho trovato che esistono due metodi: override di GetWebRequest (ho messo il link allo splendido articolo .NET WebRequest.PreAuthenticate – not quite what it sounds like in linkografia) e quello esposto nel seguito, che in questo caso ho preferito.

WebServiceName cli = new WebServiceName();
cli.ClientCredentials.UserName.UserName = "USERNAME";
cli.ClientCredentials.UserName.Password = "PASSWORD";


using (new OperationContextScope(cli.InnerChannel))
{

string auth = "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(cli.ClientCredentials.UserName.UserName + ":" + cli.ClientCredentials.UserName.Password));
HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
requestMessage.Headers["Authorization"] = auth;
OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
//Qui il codice per consumare il web service

}

...happy coding.....

 

Linkografia
.NET WebRequest.PreAuthenticate – not quite what it sounds like