Questo sito utilizza i cookie, anche di terze parti: cliccando su 'Chiudi', proseguendo nella navigazione, effettuando lo scroll della pagina o altro tipo di interazione col sito, acconsenti all'utilizzo dei cookie. Per maggiori informazioni o per negare il consenso a tutti o ad alcuni cookie, consulta l'informativa.

Stampa

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