Salute a tutti,
ho un problema analogo nel tentativo di collegarmi ai webservice aruba relativi alla fattura elettronica. Il WSDL del servizio è visibile a questo indirizzo:
https://ptefatturapa.aruba.it/fatturapaupload/uploadws?wsdl
Aggiungendo un Service Reference e provando a fare il login coi dati di prova forniti da Aruba ottengo il messaggio d'errore "Errore, autenticazione SOAP fallita. Verificare i parametri di autenticazione per l'invocazione dei metodi".
L'assistenza Aruba si è limitata a fornirmi un file in cui dice "Per l'accesso ai metodi è necessario impostare le credenziali nell'header http della richiesta soap."
Ho provato a seguire le istruzioni di Moreno, ma ottengo sempre lo stesso errore; nello specifico, questo è il codice:
Classe BasicAuthenticationInspector
Imports System.Collections.Generic
Imports System.Configuration
Imports System.Linq
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Configuration
Imports System.ServiceModel.Description
Imports System.ServiceModel.Dispatcher
Imports System.Text
Imports System.Threading.Tasks
Namespace WCFClientTest1
Public Class BasicAuthenticationInspector
Implements IClientMessageInspector
Private ReadOnly _authorization As String
Public Sub New(username As String, password As String)
If String.IsNullOrEmpty(username) OrElse String.IsNullOrEmpty(password) Then
Throw New ArgumentException("Devi fornire username e password")
End If
_authorization = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(String.Format("{0}:{1}", username, password)))
End Sub
Public Function BeforeSendRequest(ByRef messaggio As System.ServiceModel.Channels.Message, channel As System.ServiceModel.IClientChannel) As Object
'ottengo un riferimento alla richiesta http sottostante
Dim richiestaHttp = messaggio.Properties.Values.OfType(Of HttpRequestMessageProperty)().FirstOrDefault()
If richiestaHttp IsNot Nothing Then
richiestaHttp.Headers.Add("Authorization", _authorization)
Else
'non c'era? La creiamo noi.
richiestaHttp = New HttpRequestMessageProperty()
richiestaHttp.Headers.Add("Authorization", _authorization)
messaggio.Properties.Add(HttpRequestMessageProperty.Name, richiestaHttp)
End If
Return messaggio
End Function
Public Sub AfterReceiveReply(ByRef reply As System.ServiceModel.Channels.Message, correlationState As Object)
'non ci interessa esaminare la risposta
End Sub
Public Sub AfterReceiveReply1(ByRef reply As Message, correlationState As Object) Implements IClientMessageInspector.AfterReceiveReply
End Sub
Public Function BeforeSendRequest1(ByRef request As Message, channel As ServiceModel.IClientChannel) As Object Implements IClientMessageInspector.BeforeSendRequest
End Function
End Class
End Namespace
Classe BasicAuthenticationBehavior
Imports System.Collections.Generic
Imports System.Linq
Imports System.ServiceModel.Description
Imports System.ServiceModel.Dispatcher
Imports System.Text
Imports System.Threading.Tasks
Namespace WCFClientTest1
Public Class BasicAuthenticationBehavior
Implements IEndpointBehavior
Private ReadOnly _username As String
Private ReadOnly _password As String
Public Sub New(username As String, password As String)
'raccolgo user e password che passerò poi al costruttore di IClientMessageInspector
_username = username
_password = password
End Sub
Public Sub AddBindingParameters(endpoint As ServiceEndpoint, bindingParameters As System.ServiceModel.Channels.BindingParameterCollection) Implements IEndpointBehavior.AddBindingParameters
Return
End Sub
Public Sub ApplyClientBehavior(endpoint As ServiceEndpoint, clientRuntime As ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior
'aggiungo un'istanza dell'inspector
clientRuntime.MessageInspectors.Add(New BasicAuthenticationInspector(_username, _password))
End Sub
Public Sub ApplyDispatchBehavior(endpoint As ServiceEndpoint, endpointDispatcher As EndpointDispatcher) Implements IEndpointBehavior.ApplyDispatchBehavior
Return
End Sub
Public Sub Validate(endpoint As ServiceEndpoint) Implements IEndpointBehavior.Validate
Return
End Sub
End Class
End Namespace
Codice con cui istanzio il WebServices
Dim client As New ArubaWS.UploadServiceClient()
client.Endpoint.EndpointBehaviors.Add(New BasicAuthenticationBehavior(username:="username_ditest", password:="password_ditest"))
Dim ListaFatt = client.ListFatturaPA()
MsgBox(ListaFatt.returnCode)
MsgBox(ListaFatt.description)
Ma ho provato a istanziarlo anche in quest'altra maniera, sempre con lo stesso esito.
Dim BBinding As New BasicHttpsBinding()
Dim ea As New EndpointAddress("https://ptefatturapa.aruba.it/fatturapaupload/uploadws")
Dim ws_client As New ArubaWS.UploadServiceClient(BBinding, ea)
'Aggiungo il behavior che mi aggiunge i dati all'intestazione della richiesta
Dim bb As New BasicAuthenticationBehavior("username_ditest", "password_ditest")
ws_client.Endpoint.EndpointBehaviors.Add(bb)
Dim ListaFatt = ws_client.ListFatturaPA
MsgBox(ListaFatt.returnCode)
Ho provato anche a passare l'addressheader in quest'altro modo, ma ottengo sempre la stessa risposta dal webservice:
Dim BasicBinding As New BasicHttpBinding()
BasicBinding.MessageEncoding = WSMessageEncoding.Mtom
BasicBinding.SendTimeout = TimeSpan.FromSeconds(25)
BasicBinding.Security.Mode = BasicHttpSecurityMode.Transport
BasicBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic
' Create address headers for special services and add them to an array
Dim addressHeader1 As AddressHeader = AddressHeader.CreateAddressHeader("username", "https://ptefatturapa.aruba.it/fatturapaupload/uploadws", "username_ditest")
Dim addressHeader2 As AddressHeader = AddressHeader.CreateAddressHeader("password", "https://ptefatturapa.aruba.it/fatturapaupload/uploadws", "password_diprova")
'Dim addressHeader3 As AddressHeader = AddressHeader.CreateAddressHeader("SessionType", "https://ptefatturapa.aruba.it/fatturapaupload/uploadws", "None")
Dim addressHeaders() As AddressHeader = {addressHeader1, addressHeader2}
Dim address As New EndpointAddress(New Uri("https://ptefatturapa.aruba.it/fatturapaupload/uploadws"), addressHeaders)
Dim myService2 As New ArubaWS.UploadServiceClient(BasicBinding, address)
Dim ListaFatt = myService2.ListFatturaPA
MsgBox(ListaFatt.returnCode)
Il servizio Aruba è basato su JAX-WS, quindi un webservice non .NET
Dove sto sbagliando ? Grazie in anticipo per l'aiuto
Modificato da franksnet82 il 30 novembre 2014 16.48 -