WebService: lettura di dati da un servizio SOAP

' In questo esempio si fa riferimento al metodo ExecuteQuery dei WebServices di QualiWare, che rispettano lo standard SOAP
' Vengono letti dati da una tabella e mostrati all'utente in una lista di scelta.

' Creazione dell'XML con la richiesta.
' NOTA: NON MODIFICARE la URL "http://www.qualiware.it/webservices" mettendo al suo posto la URL del server!!! Altrimenti si ottiene l'errore 500.
 Dim xml As XML.Linq.XDocument = System.XML.Linq.XDocument.Parse("<?xml version=""1.0"" encoding=""utf-8""?>"+
                                        "<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" 
xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">"+
                                        "<soap:Body>"+
                                            "<ExecuteQuery xmlns=""http://www.qualiware.it/webservices/"">"+
                                                    "<DB>XXXXXX</DB>"+
                                                    "<UserCode>XXXXXXX</UserCode>"+
                                                    "<PassWord>XXXXXXX</PassWord>"+
                                                    "<SQL>SELECT CODICE,NOME from PERSON</SQL>"+
                                            "</ExecuteQuery>"+
                                        "</soap:Body>"+
                                        "</soap:Envelope>")

Dim url As String = "http://www.qualiware.it/webservices/webservices.asmx" ' URL del servizio

Dim webRequest__1 As Net.HttpWebRequest = DirectCast(Net.WebRequest.Create(url), Net.HttpWebRequest)
webRequest__1.Method = "POST"
webRequest__1.Credentials = New Net.NetworkCredential("<nome utente>", "<password>", "<dominio>") ' Questa riga non è necessaria se l'autenticazione è anonima
webRequest__1.ContentType = "text/xml; charset=UTF-8"
webRequest__1.ContentLength = xml.ToString().Length
webRequest__1.Headers.Add("SOAPAction", """http://www.qualiware.it/webservices/ExecuteQuery""") ' Azione da eseguire !IMPORTANTE: VA FRA DOPPI APICI E NON VA MODIFICATA METTENDO LA URL DEL SERVER AL POSTO DI www.qualiware.it/... ALTRIMENTI SI OTTIENE L'ERRORE 500
Using requestWriter2 As New IO.StreamWriter(webRequest__1.GetRequestStream())
      requestWriter2.Write(xml.ToString())
End Using

' Recupero della risposta
Dim response As XML.Linq.XElement
Dim ok as boolean=true
Using resp As Net.HttpWebResponse = DirectCast(webRequest__1.GetResponse(), Net.HttpWebResponse)
     if resp.StatusCode=200
        Using responseStream = resp.GetResponseStream()
              response = System.XML.Linq.XElement.Load(responseStream)
        End Using
     else
        dim msg as string="Errore durante la connessione al Web Service."+vbcr+"Status: "+ltrim(str(resp.StatusCode))+" "+resp.StatusDescription
        form.alert(msg)
        ok=false
     end if
End Using

if not ok
   return
end if
' Elaborazione della risposta e trasformazione in una DataTable
Dim t As New System.data.DataTable
Dim c As System.data.DataColumn
Dim row As System.data.DataRow
Dim i As Integer

' Crea la struttura della tabella
Dim ns As XML.Linq.XNamespace = "http://www.qualiware.it/webservices/"
For Each el As XML.Linq.XElement In response.Descendants(ns + "Fields")
    For Each f As XML.Linq.XElement In el.Nodes
        c = New System.data.DataColumn
        c.ColumnName = f.Value
        c.MaxLength = 50
        t.Columns.Add(c)
    Next
Next

For Each el As XML.Linq.XElement In response.Descendants(ns + "Rows")
    For Each r As XML.Linq.XElement In el.Nodes
        row = t.NewRow
        i = 0
        For Each f As XML.Linq.XElement In r.Nodes
            row(i) = f.Value
            i += 1
        Next

        t.Rows.Add(row)
    Next
Next

t.AcceptChanges()

' Trasformazione della DataTable in una QWTable
dim Q as new QWTable()
Q.RequestLive = False
Q.Table = t
Q.Rowset = New QWRowset(Q)

' Proposta all'utente dei records recuperati
form.ChooseRecords(form.findcontrol("RitornoChooseRecords"),Q,"Scegliere")