Problemi di connessione a web service Java

giovedì 09 luglio 2015 - 12.11
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010

bj Profilo | Newbie

Salve, sono alle prime armi con i Web Service e devo fare un'applicazione VB.NET che dialoghi con un WS realizzato in Java di cui mi e' stato dato il wsdl http://test.stefanomigliarini.it/JobWSLab/labws.service?wsdl. Uso VS Community 2013.

Il WS al momento non richiede autenticazione.

Ho cercato di documentarmi un po' ovunque, ma quando cerco di interrogare il WS ricevo inesorabilmente l'errore 417.

Chi ha sviluppato il WS mi dice di trovare il modo di tradurre in .NET questo brandello di codice del suo client Java:
-----------------------------------------------------------------------------
BindingProvider bindingProvider = (BindingProvider) ws;
bindingProvider.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://test.stefanomigliarini.it/JobWSLab/labws.service?wsdl");
-----------------------------------------------------------------------------

Questo il mio codice:
-----------------------------------------------------------------------------
Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim myEndpointAddress As New System.ServiceModel.EndpointAddress(New Uri("http://test.stefanomigliarini.it/JobWSLab/labws.service?wsdl"))
Dim myBinding As New System.ServiceModel.BasicHttpBinding()

Dim myClient As New JLab.JobLaboratorioPortTypeClient(myBinding, myEndpointAddress)

Dim datiIn As JLab.requesteForUpdateResult = New JLab.requesteForUpdateResult
Dim datiOut() As JLab.EsamiWS

datiOut = myClient.getEsami(datiIn)

End Sub
End Class
-----------------------------------------------------------------------------

Suppongo che mi manchi qualche impostazione che non riesco ad individuare.

ysdemarc Profilo | Expert

Che un WS sia fatto in Java, C#, Python o qualsiasi altro linguaggio non ha importanza...

Non capisco quello che fai.. se il ws non ha bisogno di autenticazione che significa che mi chiede utente e password?

Prova a metterlo in un browser web l'indirizzo wsdl vedi che quelloc he hai fornito richiede le credenziali.
Vincenzo
Programmatore sbilenco

bj Profilo | Newbie

Grazie Vincenzo, nel frattempo sono andato avanti e sono riuscito a raggiungere il Web Service.
A questo punto la controparte ha aggiunto le credenziali e con qualche fatica ho superato anche questo scoglio, anche se solo su http.
Questo il codice dove, una volta accertato che il server e' in grado di rispondere, recupero la lista degli esami gestiti:

Public Function getListaEsami(ByVal url As String, ByVal user As String, ByVal passwd As String, ByVal data As String, ByRef msg As String) As DataTable

Dim dt As New DataTable

dt.Columns.Add("id", GetType(Long))
dt.Columns.Add("codice", GetType(String))
dt.Columns.Add("nome", GetType(String))

Dim myEndpointAddress As New System.ServiceModel.EndpointAddress(New Uri(url))

Dim uri As New Uri(url)
Dim myBinding As New System.ServiceModel.BasicHttpBinding()
myBinding.ProxyAddress = uri
myBinding.UseDefaultWebProxy = False
myBinding.MaxReceivedMessageSize = 2147483647
myBinding.MaxBufferSize = 2147483647
myBinding.Security.Mode = ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly
myBinding.Security.Transport.ClientCredentialType = ServiceModel.HttpClientCredentialType.Basic
myBinding.Security.Transport.ProxyCredentialType = ServiceModel.HttpProxyCredentialType.None
myBinding.Security.Transport.Realm = ""

System.Net.ServicePointManager.Expect100Continue = False

Dim myClient As New JLab.JobLaboratorioPortTypeClient(myBinding, myEndpointAddress)

If user <> "" Then
myClient.ClientCredentials.UserName.UserName = user
myClient.ClientCredentials.UserName.Password = passwd
End If

Dim datiIn As JLab.requesteForUpdateResult = New JLab.requesteForUpdateResult
datiIn.descrizione_errore = ""
datiIn.esito = JLab.esito.OK
datiIn.lastUpdateDate = CDate(data)

Dim esami() As JLab.EsamiWS

Try
If myClient.isSystemUp Then
esami = myClient.getEsami(datiIn)

Dim dr As DataRow
For Each esame As JLab.EsamiWS In esami
dr = dt.NewRow
dr("id") = esame.id
dr("codice") = esame.codice
dr("nome") = esame.nome
dt.Rows.Add(dr)
Next
End If
msg = ""
Catch ex As Exception
msg = ex.Message
Exit Try
End Try

Return dt

End Function


Ora pero' dovrei passare a https con certificato e credenziali.
Ho scaricato il certificato, ma proprio non riesco a capire cosa farne.

ysdemarc Profilo | Expert

Passa all'https e vedi se ti da errore...

eventualmente hai errore policy ecc... allora metti le righe di codice riportate qui:

http://www.codeproject.com/Tips/321313/Bypass-and-Restore-SSL-Certificate-Validation-in-V

Ciao
Vincenzo
Programmatore sbilenco

bj Profilo | Newbie

Grazie del link che credo sia prezioso, non mi ci ero ancora imbattuto.

Mi scuso per i giorni lasciati passare, ma Telecom mi ha messo al buio da mercoledi scorso e non sempre posso rimediare una connessione.

Ho provato ad aggiungere le righe di codice per bypassare il controllo prima dell'instanza del client, e quelle per ripristinare il controllo dopo aver usato i metodi, ma mi si alza un'eccezione che mi sembra abbia a che fare con VS piuttosto che con il server.
In pratica non mi accetta l'url https...

Le classi sono state generate inserendo il riferimento ad https://test.stefanomigliarini.it/JobWSLab/labws.service?wsdl


Dim myEndpointAddress As New System.ServiceModel.EndpointAddress(New Uri(url))

Dim uri As New Uri("https://test.stefanomigliarini.it/JobWSLab/labws.service?wsdl")

Dim myBinding As New System.ServiceModel.BasicHttpBinding()
myBinding.ProxyAddress = uri
myBinding.UseDefaultWebProxy = False
myBinding.MaxReceivedMessageSize = 2147483647
myBinding.MaxBufferSize = 2147483647
myBinding.Security.Mode = ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly
myBinding.Security.Transport.ClientCredentialType = ServiceModel.HttpClientCredentialType.Basic
myBinding.Security.Transport.ProxyCredentialType = ServiceModel.HttpProxyCredentialType.None
myBinding.Security.Transport.Realm = ""

System.Net.ServicePointManager.Expect100Continue = False

'ByPass SSL Certificate Validation Checking
System.Net.ServicePointManager.ServerCertificateValidationCallback = _
Function(se As Object, _
cert As System.Security.Cryptography.X509Certificates.X509Certificate, _
chain As System.Security.Cryptography.X509Certificates.X509Chain, _
sslerror As System.Net.Security.SslPolicyErrors) True

Dim myClient As New JLab.JobLaboratorioPortTypeClient(myBinding, myEndpointAddress)
myClient.ClientCredentials.UserName.UserName = user
myClient.ClientCredentials.UserName.Password = passwd
....

Riporto il messaggio di errore:

System.ArgumentException è stata individuata
HResult=-2147024809
Message=Schema URI fornito 'https' non valido. Previsto 'http'.
Nome parametro: via
ParamName=via
Source=System.ServiceModel
StackTrace:
in System.ServiceModel.Channels.TransportChannelFactory`1.ValidateScheme(Uri via)
in System.ServiceModel.Channels.HttpChannelFactory`1.ValidateCreateChannelParameters(EndpointAddress remoteAddress, Uri via)
in System.ServiceModel.Channels.HttpChannelFactory`1.OnCreateChannelCore(EndpointAddress remoteAddress, Uri via)
in System.ServiceModel.Channels.HttpChannelFactory`1.OnCreateChannel(EndpointAddress remoteAddress, Uri via)
in System.ServiceModel.Channels.ChannelFactoryBase`1.InternalCreateChannel(EndpointAddress address, Uri via)
in System.ServiceModel.Channels.ChannelFactoryBase`1.CreateChannel(EndpointAddress address, Uri via)
in System.ServiceModel.Channels.ServiceChannelFactory.ServiceChannelFactoryOverRequest.CreateInnerChannelBinder(EndpointAddress to, Uri via)
in System.ServiceModel.Channels.ServiceChannelFactory.CreateServiceChannel(EndpointAddress address, Uri via)
in System.ServiceModel.Channels.ServiceChannelFactory.CreateChannel(Type channelType, EndpointAddress address, Uri via)
in System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address, Uri via)
in System.ServiceModel.ChannelFactory`1.CreateChannel()
in System.ServiceModel.ClientBase`1.CreateChannel()
in System.ServiceModel.ClientBase`1.CreateChannelInternal()
in System.ServiceModel.ClientBase`1.get_Channel()
in SanLorenzoWS.JLab.JobLaboratorioPortTypeClient.JLab_JobLaboratorioPortType_isSystemUp(isSystemUp request) in D:\ProgettiVB\SanLorenzoWS\SanLorenzoWS4S\Service References\JLab\Reference.vb:riga 9506
in SanLorenzoWS.JLab.JobLaboratorioPortTypeClient.isSystemUp() in D:\ProgettiVB\SanLorenzoWS\SanLorenzoWS4S\Service References\JLab\Reference.vb:riga 9511
in SanLorenzoWS.Module1.getListaEsami(String url, String user, String passwd, String data, String& msg) in D:\ProgettiVB\SanLorenzoWS\SanLorenzoWS4S\Module1.vb:riga 294
InnerException:

michele

ysdemarc Profilo | Expert

Qui non so aiutarti.. io ho avuto un problema simile e sono riuscito a bypassarlo solo usando uno script php e inserendo il framework php nel pacchetto di installazione...

Purtroppo non ho trovato nulla a proposito e quel poco non funzionava.

Interesserebbe ora anche a me la soluzione...

Da notare però che i certificati non li ho mai inseriti in php e a parlare chi mi ha aiutato in php tutto il problema stana nell'autentication = basic
cosa che io in c# avevo fatto ed ho visto fare pure tu.

Mi dispiace..speriamo che qualcuno più ferrato ci legga...

ciao

Vincenzo
Programmatore sbilenco
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5