Ciao sspintux
Ti dirò...io ho provato a dare un'occhiata al link che mi hai postato, ma non c'ho capito una mazza...
O meglio...non sono riuscito a capire come valorizzare gli oggetti "OperationContextScope" e "MessageHeader"; ho trovato anche altri esempi online che utilizzavano l'oggetto "SoapClient" ma, pur avendo cercato in lungo e in largo, non c'è stato verso di capire come dichiarare (in VS2010 e Framework 4.0) un oggetto "SoapClient" e passargli gli oggetti "Binding" e "EndPoint"
Alla fine, la botta di ( | )...da un post di un Forum che avevo già letto ma che non riuscivo ad utilizzare...
Posto qui la soluzione, qualora potesse essere utilie in futuro a qualcun altro...mi rimane ancora da capire come modificare l'app.config runtime (visto che l'indirizzo di EndPoint ed username e password del servizio li carico all'avvio dell'applicazione)
Quindi:
-Ho aggiunto il riferimento al servizio web mediante il suo WSDL (questa operazione, mi va a creare un file app.config all'interno del progetto)
-All'interno dell'app.config, viene creata una sezione "client" relativa ai servizi importati come mostrato di seguito
codice:
<client>
<endpoint address="https://e-servizicoll.dtt.ilportaledellautomobilista.it:443/Info-ws-sh/services/dettaglioAutoveicoloComproprietariTrasferimentiRes/"
binding="basicHttpBinding" bindingConfiguration="dettaglioAutoveicoloComproprietariTrasferimentiResSoap11"
contract="Autoveicolo.dettaglioAutoveicoloComproprietariTrasferimentiRes"
name="dettaglioAutoveicoloComproprietariTrasferimentiResSoap11">
</endpoint>
</client>
-Dopo il Tag "name", è bastato aggiungere l'header richiesto dal Web Service in questo modo:
codice:
<client>
<endpoint address="https://e-servizicoll.dtt.ilportaledellautomobilista.it:443/Info-ws-sh/services/dettaglioAutoveicoloComproprietariTrasferimentiRes/"
binding="basicHttpBinding" bindingConfiguration="dettaglioAutoveicoloComproprietariTrasferimentiResSoap11"
contract="Autoveicolo.dettaglioAutoveicoloComproprietariTrasferimentiRes"
name="dettaglioAutoveicoloComproprietariTrasferimentiResSoap11">
<headers>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>MY_USERNAME</wsse:Username>
<wsse:Password>MY_PASSWORD</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</headers>
</endpoint>
</client>
-A questo punto, si passa allo sviluppo VB: innanzi tutto, visto che il servizio web richiede un certificato, l'ho "imbrogliato" in questo modo:
codice:
'Evento di avvio del form
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
'Imposto (all'avvio per sempre) l'autenticazione Ssl3 e la risposta forzata a "True" alla richiesta di certificato necessari per il servizio di motorizzazione
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf AcceptAllCertifications)
End Sub
'Callback richiesta certificato
Private Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
'Restituisce True qualsiasi certificato venga richiesto
Return True
End Function
-Ora, nella routine dove si deve consumare il servizio Web, è necessario dichiarare una variabile del tipo importato mediante l'importazione servizio Web, SPECIFICANDO NEL "NEW" IL PARAMETRO "name" CHE ABBIAMO VISTO PRIMA NEL FILE app.config
codice:
Dim myClient As New Autoveicolo.dettaglioAutoveicoloComproprietariTrasferimentiResClient("dettaglioAutoveicoloComproprietariTrasferimentiResSoap11")
Dim rq As New Autoveicolo.DettaglioAutoveicoloBaseType
Dim tg As New Autoveicolo.TargaType
tg.numeroTarga = "AA123ZZ"
rq.dettaglioAutoveicoloBaseInput = New Autoveicolo.DettaglioAutoveicoloBaseInputType
rq.dettaglioAutoveicoloBaseInput.Item = tg
Dim lg As New Autoveicolo.LoginType
lg.codicePin = ""
rq.login = lg
rq.pdf = False
Dim rs As Autoveicolo.DettaglioAutoveicoloComproprietariTrasferimentiResResponseType
rs = myClient.dettaglioAutoveicoloComproprietariTrasferimentiRes(rq)
...e finalmente, mi ritrovo l'oggetto "rs" valorizzato con tutti i parametri ritornati dal Web Service.
Questo è quanto...non posso purtroppo dare eventuale supporto perchè non c'ho capito molto nemmeno io e probabilmente ci sarà dei modi più eleganti per farlo, ma è sempre meglio che analizzare riga per riga, tag per tag, la risposta "GetResponseStream".
Non mi rimane che capire come modificare l'app.config runtime in base a EndPoint e Username/Password letti da file config XML.
Ti ringrazio infinitamente per il supporto e per il tempo dedicatomi
Buona serata