Response WSDL

di il
8 risposte

Response WSDL

Buona sera a tutti,
ho problemi con la risposta di un WSDL nel senso che compongo la busta SOAP la cifro la serializzo e la invio.
tutto corretto controllando il traffico sul protocollo HTTP.
L'applicativo però va in exception con il messaggio "Fault occurred while processing".

Contatto il supporto tecnico, mi conferma che la richiesta inviata è corretta
però restituisce un errore per valorizzazione dati errata e mi allegano il risultato in un file XML
e mi scrive:
<<
in caso di errori viene restituito un soap fault finito nella exception.
Poichè il messaggio della exception non copmprende tutta la response,
Per vedere gli errori dovete espandere il dettaglio della response (il body).
Per vedere il dettaglio dovete (nel ramo della exception) estrarre il body del messaggio di fault che contiene appunto gli errori).
>>
Purtroppo non sono riuscito a espandere questo messaggio.
Quando l'applicativo va in exception l'unica descrizione che vedo è quella descritta inizialmente.

Riporto la gestione dell'errore ma mi salta sempre sulla catch e_006

<<
.....
.....
fse_Response = Nothing
fse_Request = Nothing
fse_App = Nothing
EndPoint = Nothing
'
'--
Catch e_002 As FaultException(Of fse_Piemonte.erroreFSE)
p_str_Cod_OUT = "KO"
p_str_Des_OUT = e_002.Detail.codice & " - " & e_002.Detail.descrizione

Catch e_006 As FaultException
p_str_Cod_OUT = "KO"
p_str_Des_OUT = e_006.Message

Catch e_007 As CommunicationException
p_str_Cod_OUT = "KO"
p_str_Des_OUT = e_007.Message + e_007.StackTrace

Catch ex As Exception
p_str_Cod_OUT = "KO"
p_str_Des_OUT = ex.Message & " - (Function pro_ComunicaMetadatiDocumento_FSE)"

End Try
>>

Qualcuno potrebbe aiutarmi???
il linguaggio di programmazione utilizzato vb .net 2017 framework 4.6

Grazie per l'attenzione
buona serata a tutti.

8 Risposte

  • Re: Response WSDL

    Nel momento in cui hai l'exception devi andare a leggere la risposta, ma tu non lo fai.

    Ti allego un pezzo di codice che uso per la comunicazione con la Motorizzazione, dovrai adattarla alla tua situazione, ma dovresti riuscirci.
    Per qualsiasi chiarimento chiedi pure
    
            Dim req As HttpWebRequest
            Dim res As WebResponse = Nothing
            Dim str As Stream = Nothing
            Dim err As Boolean = False
    
            req = DirectCast(WebRequest.Create(WSserver), HttpWebRequest)
            req.Method = "POST"
    
            Dim dataB As Byte() = Encoding.UTF8.GetBytes(ComandoSoapDaSpedire)
            req.ContentType = "text/xml; charset=utf-8"
            req.ContentLength = dataB.Length
    
            Try
                str = req.GetRequestStream()
            Catch ex As WebException
               ..... gestione dell'errore per mancata connessione al server
                Me.Dispose()
                Exit Sub
            End Try
            str.Write(dataB, 0, dataB.Length)
            str.Close()
    
            ' Get the response.
            Try
                res = req.GetResponse
                str = res.GetResponseStream()
            Catch ex As WebException
                If ex.Status = WebExceptionStatus.ProtocolError Then
                    err = True
                    str = ex.Response.GetResponseStream()
                End If
            End Try
            
            ... a questo punto hai "err" che vale True se c'è un errore e "str" che ti dice quale errore
            ... se "err" vale "false" hai "str" che contiene la risposta
            
    
  • Re: Response WSDL

    Buon giorno,
    grazie per la disponibilità, provo subito.
    Però ho solo un dubbio io non ho usato l'oggetto HttpWebRequest.
    buona giornata e buon lavoro
  • Re: Response WSDL

    Ciao SirJo, buon di,
    come scrivevo prima io non ho usato l'oggetto HTTPRequest per il consumer del WSDL. Oltretutto sinceramente non saprei neanche come fare perchè ci sono dei certificati da utilizzare nella chiamata.
    Ti post il metodo che ho utilizzato
    <<
    Public Sub pro_ComunicaMetadatiDocumento_FSE(ByRef p_str_IdDocumentParent As String,
    ByRef p_str_Cod_OUT As String,
    ByRef p_str_Des_OUT As String)
    Try
    '
    '--
    Dim p_str_File_NO_Firma As String = "", p_str_File_SI_Firma As String = ""
    Dim myBinding As CustomBinding = fun_CustomBinding()
    Dim EndPoint As New EndpointAddress(New Uri("https://isan.ruparpiemonte.it/dmacertclmed1/services/CLFSEService3?wsdl"),
    EndpointIdentity.CreateDnsIdentity("AAAAAA00B77B000F/CSI PIEMONTE/DEMO 20"))
    '
    '--
    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 fse_App As New fse_Piemonte.CLFSEServicePort3TypeClient(myBinding, EndPoint)
    ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications
    '
    '-- Per Test utilizzare certificato 'demservicetest.cer' altrimenti 'demservice.cer'
    Dim Certificato As New X509Certificate2
    Dim PathCer As String = ""
    Dim Firma As Byte() = Nothing
    PathCer = System.IO.Directory.GetCurrentDirectory() & "\AAAAAA00A11C000K.p12"
    Firma = File.ReadAllBytes(PathCer)
    Certificato.Import(Firma, "PIEMONTE", X509KeyStorageFlags.DefaultKeySet)
    fse_App.ClientCredentials.ClientCertificate.Certificate = Certificato
    '
    '--

    PathCer = System.IO.Directory.GetCurrentDirectory() & "\AAAAAA00B77B000F.p12"
    Firma = File.ReadAllBytes(PathCer)
    Certificato.Import(Firma, "PIEMONTE", X509KeyStorageFlags.DefaultKeySet)
    fse_App.ClientCredentials.ServiceCertificate.DefaultCertificate = Certificato
    '
    '--

    Dim myAuthProperties As X509ClientCertificateAuthentication
    fse_App.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = myAuthProperties.CertificateValidationMode.None
    '
    'Certificati
    '
    '--
    Dim fse_Request As New fse_Piemonte.RegistraEpisodioReq3
    With fse_Request
    '
    '-- Richiesta
    .richiesta = fun_FSE_Piemonte_RichiestaAzienda2(m_ut_FSE_Piemonte_RegistraEpisodioReq3.ut_Richiesta,
    p_str_Cod_OUT,
    p_str_Des_OUT)
    If p_str_Cod_OUT.Trim.ToUpper <> "OK" Then GoTo Giu
    '
    '-- Paziente
    .paziente = fun_FSE_Piemonte_PazienteFSE2(m_ut_FSE_Piemonte_RegistraEpisodioReq3.ut_Paziente,
    p_str_Cod_OUT,
    p_str_Des_OUT)
    If p_str_Cod_OUT.Trim.ToUpper <> "OK" Then GoTo Giu
    '
    '-- Episodio
    .episodio = fun_FSE_Piemonte_EpisodioFSE2(m_ut_FSE_Piemonte_RegistraEpisodioReq3.ut_Episodio,
    p_str_Cod_OUT,
    p_str_Des_OUT)
    If p_str_Cod_OUT.Trim.ToUpper <> "OK" Then GoTo Giu
    '
    '-- Documento
    .documento = fun_FSE_Piemonte_DocumentoFSE3(m_ut_FSE_Piemonte_RegistraEpisodioReq3.ut_Documento,
    p_str_Cod_OUT,
    p_str_Des_OUT)
    If p_str_Cod_OUT.Trim.ToUpper <> "OK" Then GoTo Giu
    End With
    '
    '--
    Dim fse_Response As fse_Piemonte.RegistraEpisodioRes

    fse_Response = fse_App.registraEpisodio3(fse_Request)
    '
    '--
    p_str_IdDocumentParent = fse_Response.ToString
    p_str_Cod_OUT = "OK"
    p_str_Des_OUT = p_str_IdDocumentParent
    '
    '--
    Giu:
    fse_Response = Nothing
    fse_Request = Nothing
    fse_App = Nothing
    EndPoint = Nothing
    '
    '--
    Catch e_001 As FaultException(Of HttpWebResponse)
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = e_001.Message
    Catch e_002 As FaultException(Of fse_Piemonte.erroreFSE)
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = e_002.Detail.codice & " - " & e_002.Detail.descrizione
    Catch e_003 As FaultException(Of fse_Piemonte.Ens_Response)
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = e_003.Detail.ToString
    Catch e_004 As FaultException(Of fse_Piemonte.Ens_Request)
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = e_004.Detail.ToString
    Catch e_005 As TimeoutException
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = e_005.Message
    Catch e_009 As WebException
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = e_009.Message

    Catch e_006 As FaultException
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = e_006.Message

    Catch e_007 As CommunicationException
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = e_007.Message + e_007.StackTrace

    Catch ex As Exception
    p_str_Cod_OUT = "KO"
    p_str_Des_OUT = ex.Message & " - (Function pro_ComunicaMetadatiDocumento_FSE)"

    End Try
    '
    '--
    End Sub
    >>

    purtroppo dalle specifiche tecniche è riportato che il metodo restituisce un tipo di dato strutturato, ma in realtà non è cosi, di conseguenza quando va in errore mi va in exeption e sulla Catch e_006 As FaultException

    Grazie mille per l'attenzione
  • Re: Response WSDL

    Buon dì
    c'è qualcuno che può aiutarmi???
    Vorrei utilizzare per la richiesta del servizio, anche l'oggetto HttpWebRequest, però non so come fare
    ad impostare i giusti parametri per la CUSTOM BINDING e l'utilizzo di un certificato client e di uno server.

    Grazie per l'attenzione
    buona giornata a tutti.
  • Re: Response WSDL

    Ma se usi il codice che ti ho dato io che cosa succede ??
  • Re: Response WSDL

    Ciao SirJo,
    in realtà non sono riuscito ad agganciarlo, in quanto come già descritto nei post precedenti,
    non so come impostare i parametri di bindig e security con l'oggetto HTTPWebRequest.
    Il servizio da richiamare è esposto in HTTPS con autenticazione WS-Security (profile: Sign and Encrypt - X509 Authentication con Timestamp)...
    Io ho creato il mio metodo pro_ComunicaMetadatiDocumento_FSE ma quando invoco il metodo fse_App.registraEpisodio3(fse_Request) che in caso di errori (mancanza di giusta valorizzazione di parametri), viene restituito un soap fault nella exception, che riesco a catturare solo con la FaultException generica

    Contattando il supporto tecnico di riferimento mi ha risposto:

    >>

    Il messaggio della exception non comprende tutta la response.
    Per vedere gli errori dovete espandere il dettaglio della response (il body).
    il messaggio della exception che vedete è il campo reason della response

    <soap-env:Reason>
    <soap-env:Text xml:lang="it">Fault occurred while processing.</soap-env:Text>
    </soap-env:Reason>

    Per vedere il dettaglio dovete (nel ramo della exception) estrarre il body del messaggio di fault che contiene appunto gli errori.
    Per la gestione degli errori dovete (probabilmente) costruirvi una classe che possa leggere i dettagli (es.):

    <errori>
    <codice>FSE_ER_142</codice>
    <descrizione>I dati di accettazione data e matricola devono essere valorizzati oppure essere tutti vuoti insieme all’ora</descrizione>
    </errori>

    >>

    Ecco la mia grande difficoltà che mi blocca.
    Grazie per l'attenzione
    Antonio V.
  • Re: Response WSDL

    Buon giorno a tutti,
    ho risolto il problema,. ora sono in grado di gestire le eccezioni SOAP generate dal servizio.
    Sono anche lieto di condividere con voi la soluzione che potrà in futuro essere utile.

    Nel metodo dove gestisco le EXCEPTION, richiamo il metodo ExceptionManagementHandler che mi risolve il problema di estrapolare il dettaglio delle eccezioni generate lato server.
    
          .....
          ......
          Catch e_004 As FaultException
                p_str_Cod_OUT = "KO"
                p_str_Des_OUT = e_004.Message
                Call ExceptionManagementHandler(e_004, "simple")
            Catch e_006 As Exception
                p_str_Cod_OUT = "KO"
                p_str_Des_OUT = e_006.Message
    
                '
                '--
            End Try
            '
            '--
    
    di seguito riporto i metodi necessari, che naturalmente andrebbero gestiti in una classe/modulo,
    poi sarà soggettiva la soluzione.
    
    Private Sub ExceptionManagementHandler(ByVal exception As Exception, ByVal exceptionType As String)
            Try
                Dim s As String = exception.GetBaseException().ToString()
                Const delimStr As String = ":"
                Dim delimiter As Char() = delimStr.ToCharArray()
                Dim ss As String() = s.Split(delimiter)
    
                If ss(0).EndsWith("FaultException") Then
    
                    Select Case exceptionType
                        Case "simple"
                            SimpleSoapExceptionHandler(exception)
                            'Case Multiple
                            '    MultiElementSoapExceptionHandler(exception)
                            'Case Complex
                            '    ComplexSoapExceptionHandler(exception)
                        Case Else
                            Throw exception
                    End Select
                Else
                    Throw exception
                End If
            Catch timeoutException As TimeoutException
                Dim msg As String = timeoutException.Message
                MsgBox(msg, MsgBoxStyle.Exclamation)
            Catch argumentException As ArgumentException
                Dim msg As String = argumentException.Message
                MsgBox(msg, MsgBoxStyle.Exclamation)
            Catch endpointNotFoundException As EndpointNotFoundException
                Dim msg As String = endpointNotFoundException.Message
                MsgBox(msg, MsgBoxStyle.Exclamation)
            Catch communicationException As CommunicationException
                Dim msg As String = communicationException.Message
                MsgBox(msg, MsgBoxStyle.Exclamation)
            Catch invalidOperationException As InvalidOperationException
                Dim msg As String = invalidOperationException.Message
                MsgBox(msg, MsgBoxStyle.Exclamation)
            Catch nullReferenceException As NullReferenceException
                Dim msg As String = nullReferenceException.Message
                MsgBox(msg, MsgBoxStyle.Exclamation)
            Catch ex As Exception
                Dim msg As String = ex.Message
                MsgBox(msg, MsgBoxStyle.Exclamation)
            End Try
        End Sub
        '
        '--
        Private Sub SimpleSoapExceptionHandler(ByVal exception As Exception)
            Try
                Throw exception
            Catch faultException As FaultException
                Dim messageFault As MessageFault = faultException.CreateMessageFault()
    
                If messageFault.HasDetail Then
                    Dim doc = New XmlDocument()
                    Dim node = doc.CreateNode(XmlNodeType.Element, SoapException.DetailElementName.Name, SoapException.DetailElementName.[Namespace])
                    Dim detail = GetXElement(node)
                    Dim xElement = GetXElement(messageFault.GetDetail(Of XmlElement)())
                    detail.Add(xElement)
                    node = GetXmlNode(detail)
                    Dim faultNameSpace As String = "CODE NAMESPACE   : " & faultException.Code.[Namespace]
                    Dim faultCode As String = "CODE NAME        : " & faultException.Code.Name
                    Dim faultString As String = "EXCEPTION MESSAGE:" & vbLf & faultException.Message
                    Dim faultTypeName As String = "XML ELEMENT NAME : " & xElement.Name.LocalName
                    Dim faultType As String = "XML ELEMENT VALUE: " & xElement.Value
                    Dim innerText As String = "RAW INNERTEXT    :" & vbLf & node.InnerText
                    MsgBox(faultNameSpace & vbLf & faultCode & vbLf & faultString & vbLf & vbLf & faultTypeName & vbLf & faultType & vbLf & vbLf & innerText, MsgBoxStyle.Exclamation)
                End If
            End Try
        End Sub
    
        Public Shared Function GetXElement(ByVal node As XmlNode) As XElement
            Dim xDoc As XDocument = New XDocument()
    
            Using xmlWriter As XmlWriter = xDoc.CreateWriter()
                node.WriteTo(xmlWriter)
            End Using
    
            Return xDoc.Root
        End Function
    
        Public Shared Function GetXmlNode(ByVal element As XElement) As XmlNode
            Using xmlReader As XmlReader = element.CreateReader()
                Dim xmlDoc As XmlDocument = New XmlDocument()
                xmlDoc.Load(xmlReader)
                Return xmlDoc
            End Using
        End Function
    
        '
        '--
    
    Buona giornata a tutti
    grazie per l'attenzione
    Antonio V.
  • Re: Response WSDL

    Bravo !!
Devi accedere o registrarti per scrivere nel forum
8 risposte