10 messaggi dal 09 gennaio 2017
Un cordiale saluto a tutti.
Sono alle prese con un ostacolo che non riesco a scavalcare.
Sto producendo un programma client per l'invio di dati in un web service.
Il programma è in vb2010. Prima di ammazzarmi per creare tutto il software ho provato a fare delle prove di invio.
Dal file wdsl ho creato il web references in modo da creare i metodi. Fin qui tutto bene.

Questo è il codice (Ho variato i dati anche perché user e password sono reali e non posso divulgarli)

 Dim Buono As New entetest.web_service
        Dim EsitoBuono As String
        Dim i As Long

        Dim myservice As New WebProxy("http://entetest.software.it/it/soap_ws/index/wsdl")

        Dim mycredentialCache As CredentialCache = New CredentialCache()

        Dim credentials As NetworkCredential = New NetworkCredential("USER", "PASS")

        mycredentialCache.Add(New Uri("http://entetest.software.it/it/soap_ws/index/wsdl"), "Basic", credentials)


        myservice.Credentials = mycredentialCache


        Dim CodiceEnrControparte As String
        CodiceEnrControparte = ""


        Buono.Credentials = credentials
        Try
            EsitoBuono = Buono.setBuono("VS0000", "VS0000", "VA2435", "VA2435", "04", "04", "ROMBO", 500, "", "BUONO PROVA 001", "2016", 1, 1)
        Catch ex As Exception
            MsgBox("Attezione. Errore: " & ex.Message)
        End Try
        MsgBox(EsitoBuono)

        TextBox3.Text = EsitoBuono



Risultato: "Invalid Authentication"

Sono sicuro che interroga il web service e che le credenziali inserite siano giuste.
Nota: Il protocollo è il Soap.
Infatti ho provato i metodi con SoapUI, autenticati con user e password come basic pre-emptively e funzionano.
Invece in vb 2010 ho provato vari codici, ma nulla.
Io ho creato i metodi con web reference. Navigando i rete ho letto alcune info che per il protocollo soup è meglio usare service reference.
Che ne pensate? E' forse questo che causa la mancata autenticazione?
Davvero, è la mia prima esperienza con i web service, se qualcuno può darmi una mano ne sarei grato.
Tutte le informazioni sono utili. :wink:
Ho provato anche altri forum ma sono stato bellamente ignorato. Non so se per snobismo o perché la questione è irrisolvibile (speriamo di no).
Grazie a tutti e buona giornata.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao e benvenuto nel forum,
per il momento dovresti confrontare il contenuto della richiesta SOAP che parte dal tuo programma con quella che invece viene inviata da SoapUI.
Puoi vedere il contenuto delle richieste che partono dal tuo PC usando Fiddler. Installalo e lancialo e ogni volta che effettui una richiesta web (dal tuo programma come da qualsiasi altro) la vedrai apparire, così che potrai ispezionarla. Vai a vedere il contenuto grezzo e poi dicci in cosa si differenza la tua richiesta da quella di SoapUI. In particolare verifica come e dove vengono passate le credenziali. Se il servizio è protetto da Basic Authentication, allora troverai un'intestazione HTTP "Authorization" e le credenziali saranno codificate in base64.


Non so se per snobismo o perché la questione è irrisolvibile (speriamo di no).

No no, il fatto è che nei forum il contributo è volontario e ciascuno mette a disposizione il proprio tempo libero per rispondere. Se la questione non è facilmente riproducibile in locale diventa oneroso riuscire a capire il problema e per questo potresti non ricevere soluzioni.
Anche se questo è un problema all'apparenza semplice, non è detto che chi ti legge l'abbia già affrontato e si trovasse nella tua specifica situazione.
Su ASPItalia cerchiamo di rispondere anche se non abbiamo la soluzione in mano perché a volte basta giusto dare qualche input. Ma la garanzia del risultato non possiamo darla perché ovviamente non siamo consulenti pagati per risolvere il problema.

ciao,
Moreno

Enjoy learning and just keep making
10 messaggi dal 09 gennaio 2017
Grazie Moreno.
Farò come mi dici e vediamo se riesco a risolvere.

Lo so che nei forum uno dà il tempo che ha. :) Non voglio polemizzare, ci mancherebbe altro, è che cerco un riscontro da mesi. Ho provato su due forum differenti prima di approdare ad aspitalia. Ero un tantino sconfortato.

Allora provo a seguire la strada che mi hai indicato. ;)
Grazie ancora.
10 messaggi dal 09 gennaio 2017
Allora, prova effettuata, solo che mi dovete aiutare a capirci qualcosa.

Prima prova col mio programma in vb2010.
Fiddler:
Linguetta (Inspectors) voce Auth : No Proxy-Authorization Header is present. No Authorization Header is present.

Linguetta (Statistic)

ACTUAL PERFORMANCE
--------------
ClientConnected:14.42.01.390
ClientBeginRequest:14.42.01.406
GotRequestHeaders:14.42.01.406
ClientDoneRequest:14.42.01.750
Determine Gateway:0ms
DNS Lookup: 0ms
TCP/IP Connect:52ms
HTTPS Handshake:0ms
ServerConnected:14.42.01.812
FiddlerBeginRequest:14.42.01.812
ServerGotRequest:14.42.01.812
ServerBeginResponse:14.42.01.875
GotResponseHeaders:14.42.01.968
ServerDoneResponse:14.42.01.968
ClientBeginResponse:14.42.01.968
ClientDoneResponse:14.42.01.968


Seconda prova col SoapUi che effettivamente mi da risposta positiva (ovvero ha accettato i dati e li ha processati).
Fiddler:
Linguetta (Inspectors) voce Auth : No Proxy-Authorization Header is present. Authorization Header is present: Basic VlM0MDA2MDE6Q0FNMjUwOA==
Decoded Username:Password= User:Pass (User e Pass li ho modificati perché non voglio divulgarli)

Linguetta (Statistic)

ACTUAL PERFORMANCE
--------------
ClientConnected:14.50.58.765
ClientBeginRequest:14.50.58.765
GotRequestHeaders:14.50.58.765
ClientDoneRequest:14.50.58.765
Determine Gateway:0ms
DNS Lookup: 0ms
TCP/IP Connect:83ms
HTTPS Handshake:0ms
ServerConnected:14.50.58.859
FiddlerBeginRequest:14.50.58.859
ServerGotRequest:14.50.58.859
ServerBeginResponse:14.50.58.937
GotResponseHeaders:14.50.58.968
ServerDoneResponse:14.50.58.968
ClientBeginResponse:14.50.58.968
ClientDoneResponse:14.50.58.968


Ho visto che effettivamente nel secondo caso ci sono le autorizzazioni.
Non so bene cosa devo andare a verificare.
:(
Modificato da max_dev78 il 09 gennaio 2017 15.38 -
Modificato da max_dev78 il 09 gennaio 2017 18.13 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Linguetta (Inspectors) voce Auth : No Proxy-Authorization Header is present. Authorization Header is present: Basic VlM0MDA2MDE6Q0FNMjUwOA==

Va bene, queste informazioni sono sufficienti. Effettivamente le credenziali non vengono inviate quando invochi il servizio con la tua classe proxy.
Questo in realtà è normale, perché la classe proxy non invia le credenziali alla prima richiesta ma aspetta che il server risponda con una challenge (ovvero includa una esplicita intestazione WWW-Authenticate nella risposta) per avere la certezza che le credenziali vengano inviate ad un servizio in grado di interpretarle con quel meccanismo di autenticazione che tu hai configurato (la Basic).

Questo articolo spiega la cosa molto precisamente.
https://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like

Probabilmente gli autori di questo webservice hanno implementato male la Basic Authentication e non ti stanno rispondendo con la challenge. Di conseguenza, la tua classe proxy pensa che la Basic Authentication non sia supportata e quindi non ritenta la richiesta includendo le credenziali.

La soluzione consiste nell'aggiungere l'intestazione Authorization a mano. Per prima cosa butta via questo blocco di codice, tanto abbiamo visto che in questa situazione non serve.
Dim mycredentialCache As CredentialCache = New CredentialCache()
Dim credentials As NetworkCredential = New NetworkCredential("USER", "PASS")
mycredentialCache.Add(New Uri("http://entetest.software.it/it/soap_ws/index/wsdl"), "Basic", credentials)
myservice.Credentials = mycredentialCache


Ora aggiungi una nuova classe al tuo progetto e mettici dentro questo:
Namespace QuiIlNamespaceDellaClasseWebProxy
    Partial Public Class WebProxy

        Protected Overrides Function GetWebRequest(uri As Uri) As WebRequest
            Dim request = MyBase.GetWebRequest(uri)
            Dim username = "Mario"
            Dim password = "PantaloniRossi"
            Dim credenziali = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password))
            'Aggiungo l'intestazione authorization
            request.Headers.Add("Authorization", "Basic " & credenziali)
            Return request
        End Function

    End Class
End Namespace

Lo scopo qui è aggiungere codice alla tua classe proxy e lo facciamo grazie a questa Partial, che è un modo di definire una stessa classe su altri file di codice .vb. In particolare qui ci serve fare l'override del metodo GetWebRequest per andare ad aggiungere l'intestazione HTTP Authorization.
Non fare un esatto copia-incolla del mio esempio perché il namespace dovrà essere quello della tua classe WebProxy. Per capire qual è il suo namespace, clicca sulla parola WebProxy in questa linea di codice che hai già.
Dim myservice As New WebProxy("http://entetest.software.it/it/soap_ws/index/wsdl")

e poi, quando il cursore lampeggiante è lì in mezzo, premi F12 per andare alla definizione della classe. Su in altro troverai il nome del namespace.

A questo punto, dato che l'intestazione Authorization è stata aggiunta manualmente, il problema della challenge che ti dicevo sopra non ti riguarderà più.

ciao,
Moreno
Modificato da BrightSoul il 09 gennaio 2017 21.46 -

Enjoy learning and just keep making
10 messaggi dal 09 gennaio 2017
Ora mi metto al lavoro. :) Poi ti dico.
Grazie.
10 messaggi dal 09 gennaio 2017
Solo una perplessità.
Ho aggiunto al progetto una nuova classe (classWeb.vb)
Dove ho inserito il tuo codice.
Ho messo il namespace della classe webproxy però mi rimane segnato proprio l'istruzione "namespace".
(Le istruzioni 'namespace' possono trovarsi solo a livello file o di spazio dei nomi).
Non uso vb2010 da molto tempo, ma questa anomalia mi è nuova.
Modificato da max_dev78 il 10 gennaio 2017 14.09 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


una nuova classe (classWeb.vb)

Ok, elimina qualsiasi cosa ci fosse nel file classWeb.vb e incolla esattamente il codice che ti ho riportato.

Credo che l'errore si riferisca al fatto che hai inserito il namespace all'interno di una classe o di qualche altro contenitore.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.