Consumare un web service Java Axis 1.*

Se vi dovesse capitare di dover consumare un web service implementato utilizzando il framework Java Axis 1.*, che utilizza http basic authentication, è necessario che apportiate qualche modifica al client generato da Visual Studio per far si che il tutto funzioni correttamente poiché, utilizzando la versione generata del proxy, username e password arriveranno sempre al web service con valore null.

Dopo aver aggiunto una web reference, o dopo aver implementato il client del servizio utilizzando lo strumento a linea di comando wsdl.exe, ed aver aggiunto al progetto la classe generata, implementiamo una nuova classe ed ereditiamo da quella generata.

Successivamente, ridefiniamo il metodo WebRequest ed introduciamo la gestione del Header "Authorization" così come previsto dalla specifica http basic authentication :

class myJaxRpcService : WebReference.myJaxRpcService
  {
      protected override WebRequest GetWebRequest(Uri uri)
      {
          HttpWebRequest webRequest = (HttpWebRequest)base.GetWebRequest(uri);
          webRequest.ProtocolVersion = HttpVersion.Version10;
          NetworkCredential credentials = Credentials as NetworkCredential;
          if (credentials != null)
          {
              string authInfo =
                ((credentials.Domain != null) && (credentials.Domain.Length > 0) ?
                credentials.Domain + @"\" : string.Empty) +
                credentials.UserName + ":" + credentials.Password;
              authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
              webRequest.Headers["Authorization"] = "Basic " + authInfo;
          }
          return webRequest;
      }

  }

Infine invochiamo il proxy come di consueto, avendo cura di creare un oggetto NetworkCredential e assegnare le credenziali assegnate al proxy del web service invocato:

try
{
    myJaxRpcService proxy = new myJaxRpcService ();
    proxy.Credentials = new NetworkCredential(TxtUsername.Text, TxtPassword.Text);
    proxy.PreAuthenticate = true;
    proxy.Url = TxtUrl.Text;
    proxy.Do()  

}
catch (Exception ex)
{
    MessageBox.Show(ex.Message,"", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

ed il tutto funzionerà correttamente Big Smile.

Published Sunday, May 23, 2010 9:04 PM by leo.alario
Powered by Community Server (Commercial Edition), by Telligent Systems