Italian Connessione a Web Service asmx

ildalla83

Member
Licensed User
Ciao sono un nuovo sviluppatore B4A.
Vorrei connettere la mia app ad un web service asmx (sql server) pubblicato sul mio sito http://mywebsite/ws/service.asmx.
Devo chiamare il metodo "getElencoDocTutti" che mi ritorna un recordset. Questi dati voglio inserirli in una lista che poi popolerà la mia form.
Ho letto le guide sul forum ma non ho capito come utilizzare la libreria httpUtils2
Qualcuno può darmi una mano?
Grazie
 

uniplan

Active Member
Licensed User
Longtime User
Ciao è abbastanza semplice.
In questo momento non mi è possibile, ma più tardi ti invio un esempio.
 

uniplan

Active Member
Licensed User
Longtime User
Ecco il codice.
La chiamata la fai in questo modo:
B4X:
Private sub chiamata()
        Dim syncJob As HttpJob
        Dim stringToUpload As String = ""

        stringToUpload = "vvvv" 'qui metti i dati che vuoi passare ti consiglio di convertirli in base64
        Dim indirizzo_completo As String = "http://mywebsite/ws/service.asmx" &   "/nome_funzione_chiamata"
        syncJob.Initialize("nome_funzione_chiamata",  Me)
        syncJob.PostBytes( indirizzo_completo,stringToUpload.GetBytes("UTF8"))
End Sub

la risposta (asincrona) ti arriva nel seguente evento:

B4X:
Sub JobDone (Job As HttpJob)

    Try
        If Job.Success = True Then
            Select Job.JobName
           
                Case "nome_funzione_chiamata"
                    gestione_esito_nome_funzione_chiamata(Job.GetString)
       
            End Select
        Else
            Select Job.JobName
           
                Case "nome_funzione_chiamata"
                    'qui gestisci il caso di risposta con esito negativo

            End Select

        End If
   
    Catch
        Select Job.JobName
            Case "nome_funzione_chiamata"
                'qui gestisci l'errore
        End Select
    End Try
    Job.Release

End Sub

Attenzione i dati che passi nella chiamata al webservice ti arrivano nell'header lato VB.
Pertanto li devi estrarre nel seguente modo:

B4X:
            Dim _httpRequest As HttpRequest = HttpContext.Current.Request
            Dim _requestLength As Long = _httpRequest.InputStream.Length
            Dim _xmlFileAsByteAray() As Byte
            ReDim _xmlFileAsByteAray(_requestLength)
            Dim _xmlStrB64 As String = ""
            Dim _xmlStr As String = ""

            Try
                _httpRequest.InputStream.Read(_xmlFileAsByteAray, 0, System.Convert.ToInt32(_requestLength))
                _xmlStrB64 = System.Text.Encoding.UTF8.GetString(_xmlFileAsByteAray, 0, UBound(_xmlFileAsByteAray)) 'stringa ricevuta

            Catch ex As Exception

            End Try

Io solitamente invio i dati da B4A al WebService in formato XML convertito in base64 ed invio le risposte da VB a B4A in formato Json sempre convertito in base64.
 

ildalla83

Member
Licensed User
l'ultimo pezzo di codice dovrei inserirlo lato web service giusto? in realtà il web service è scritto in c# ed è già funzionante con un'altra applicazione web. Se provo a contattarlo con il codice che mi hai indicato mi viene restituito il seguente log

** Service (httputils2service) Start **
ResponseError. Reason: Internal Server Error, Response: <!DOCTYPE html> .....

direi che sono ancora in alto mare
 

ildalla83

Member
Licensed User
aiuto ancora non sono riuscito a risolvere la situazione, cosa mi dici riguardo il mio ultimo post sopra?
 

ildalla83

Member
Licensed User
no problem
Questo è il log
B4X:
Logger connesso a:  samsung SM-J500FN
--------- beginning of main
--------- beginning of system
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
ResponseError. Reason: Internal Server Error, Response: <!DOCTYPE html>

<html>

    <head>

        <title>Formato della richiesta non riconosciuto. L'URL termina in modo imprevisto con '/getElencoDocTutti'.</title>

        <meta name="viewport" content="width=device-width" />

        <style>

         body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}

         p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}

         b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}

         H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }

         H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }

         pre {font-family:"Consolas","Lucida Console",Monospace;font-size:11pt;margin:0;padding:0.5em;line-height:14pt}

         .marker {font-weight: bold; color: black;text-decoration: none;}

         .version {color: gray;}

         .error {margin-bottom: 10px;}

         .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }

         @media screen and (max-width: 639px) {

          pre { width: 440px; overflow: auto; white-space: pre-wrap; word-wrap: break-word; }

         }

         @media screen and (max-width: 479px) {

          pre { width: 280px; }

         }

        </style>

    </head>



    <body bgcolor="white">



            <span><H1>Errore server nell'applicazione '/ws'.<hr width=100% size=1 color=silver></H1>



            <h2> <i>Formato della richiesta non riconosciuto. L'URL termina in modo imprevisto con '/getElencoDocTutti'.</i> </h2></span>



            <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">



            <b> Descrizione: </b>Eccezione non gestita durante l'esecuzione della richiesta Web corrente. Per ulteriori informazioni sull'errore e sul suo punto di origine nel codice, vedere la traccia dello stack.



            <br><br>



            <b> Dettagli eccezione: </b>System.InvalidOperationException: Formato della richiesta non riconosciuto. L'URL termina in modo imprevisto con '/getElencoDocTutti'.<br><br>



            <b>Errore nel codice sorgente:</b> <br><br>



            <table width=100% bgcolor="#ffffcc">

               <tr>

                  <td>

                      <code>



Durante l'esecuzione della richiesta Web corrente &#232; stata generata un'eccezione non gestita. Per informazioni sull'origine e la posizione dell'eccezione, vedere la traccia dello stack dell'eccezione riportata di seguito.</code>



                  </td>

               </tr>

            </table>



            <br>



            <b>Traccia dello stack:</b> <br><br>



            <table width=100% bgcolor="#ffffcc">

               <tr>

                  <td>

                      <code><pre>



[InvalidOperationException: Formato della richiesta non riconosciuto. L&#39;URL termina in modo imprevisto con &#39;/getElencoDocTutti&#39;.]

   System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +694

   System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +271

   System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated) +81

   System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +378

   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +157

</pre></code>



                  </td>

               </tr>

            </table>



            <br>



            <hr width=100% size=1 color=silver>



            <b>Informazioni di versione:</b>&nbsp;Versione di Microsoft .NET Framework:4.0.30319; Versione di ASP.NET:4.6.1590.0



            </font>



    </body>

</html>

<!--

[InvalidOperationException]: Formato della richiesta non riconosciuto. L&#39;URL ter
Message longer than Log limit (4000). Message was truncated.


Mentre questo è il codice del webservice:

B4X:
namespace wsks
{
    public class Contatori
    {
        public string Categoria { get; set; }
        public int Documenti { get; set; }
    }
    /// <summary>
    /// Descrizione di riepilogo per Service
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // Per consentire la chiamata di questo servizio Web dallo script utilizzando ASP.NET AJAX, rimuovere il commento dalla riga seguente.
    // [System.Web.Script.Services.ScriptService]
    public class Service : System.Web.Services.WebService
{
        [WebMethod]
        public DataSet getElencoDocTutti(string username, string password, string matricoladev)
        {
            string sSQL = "";

            if ((string.IsNullOrEmpty(username)) || (string.IsNullOrEmpty(password)))
            {
                return null;
            }

            if (!checkLogin(username, (password)))
            {
                return null;
            }

            if (!UtenteAutorizzato(username, (password)))
            {
                return null;
            }



            string codsede = getSedeDaUserName(username);
            int livelloUsr = getLivelloDaUserName(username, codsede);

            //TODO: recuperare IdDevice per controllo scaricato o meno

            sSQL = GetSqlDocumenti(livelloUsr, codsede, username, false, false);
            sSQL = sSQL + " order by CategorieDocumento.Descrizione, Documenti.NotaDocumento, Documenti.IDLingua ";

            var con = new SqlConnection(ConnectionState());

            try
            {
                con.Open();
                SqlDataAdapter da = new SqlDataAdapter(sSQL, con);
                DataSet ds = new DataSet();
                da.Fill(ds);
                return ds;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
        }
}

Grazie!
 

Emme Developer

Well-Known Member
Licensed User
Longtime User
Scusa, come fai a fare la chiamata da un altra webapp? Usi un semplice url con richiesta in http? Sembra ci sia un incompatibilità tra il modo in cui viene chiamata la richiesta e il formato in cui viene accettata dal web server
 

Emme Developer

Well-Known Member
Licensed User
Longtime User
Si chiamo il WS con l'URL
Prova a usare questo codice
B4X:
Dim j As HttpJob
j.Initialize("",Me)
j.Download(url)
Wait for (j) JobDone (j as httpjob)
log(j.success)
if j.success then log(j.getstring)

Usa OkHttp come libreria, e OkHttpUtils2
 

ildalla83

Member
Licensed User
Ancora problemi...
Ho richiamato una funzione del ws che richiede 2 parametri: username e password
Passo entrambi i dati con il comando

syncJob.Download2(ServiceSite, Array As String("username",User,"password",Pass))

Mi risponde true al success ma poi ricevo questo log

B4X:
Logger connesso a:  samsung SM-J500FN
--------- beginning of main
--------- beginning of system
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
*** Service (httputils2service) Create ***
** Service (httputils2service) Start **
true




<html>



    <head><link rel="alternate" type="text/xml" href="/ws/service.asmx?disco" />



    <style type="text/css">

    

        BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; }

        #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; }

        A:link { color: #336699; font-weight: bold; text-decoration: underline; }

        A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; }

        A:active { color: #336699; font-weight: bold; text-decoration: underline; }

        A:hover { color: cc3300; font-weight: bold; text-decoration: underline; }

        P { color: #000000; margin-top: 0px; margin-bottom: 12px; font-family: Verdana; }

        pre { background-color: #e5e5cc; padding: 5px; font-family: Courier New; font-size: x-small; margin-top: -5px; border: 1px #f0f0e0 solid; }

        td { color: #000000; font-family: Verdana; font-size: .7em; }

        h2 { font-size: 1.5em; font-weight: bold; margin-top: 25px; margin-bottom: 10px; border-top: 1px solid #003366; margin-left: -15px; color: #003366; }

        h3 { font-size: 1.1em; color: #000000; margin-left: -15px; margin-top: 10px; margin-bottom: 10px; }

        ul { margin-top: 10px; margin-left: 20px; }

        ol { margin-top: 10px; margin-left: 20px; }

        li { margin-top: 10px; color: #000000; }

        font.value { color: darkblue; font: bold; }

        font.key { color: darkgreen; font: bold; }

        font.error { color: darkred; font: bold; }

        .heading1 { color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal; background-color: #003366; margin-top: 0px; margin-bottom: 0px; margin-left: -30px; padding-top: 10px; padding-bottom: 3px; padding-left: 15px; width: 105%; }

        .button { background-color: #dcdcdc; font-family: Verdana; font-size: 1em; border-top: #cccccc 1px solid; border-bottom: #666666 1px solid; border-left: #cccccc 1px solid; border-right: #666666 1px solid; }

        .frmheader { color: #000000; background: #dcdcdc; font-family: Verdana; font-size: .7em; font-weight: normal; border-bottom: 1px solid #dcdcdc; padding-top: 2px; padding-bottom: 2px; }

        .frmtext { font-family: Verdana; font-size: .7em; margin-top: 8px; margin-bottom: 0px; margin-left: 32px; }

        .frmInput { font-family: Verdana; font-size: 1em; }

        .intro { margin-left: -15px; }

          

    </style>



    <title>

    Service Servizio Web

</title></head>



  <body>



    <div id="content">



      <p class="heading1">Service</p><br>



      



      



      

      



    

    

      



      <span>

          Fare clic <a href="service.asmx">qui</a> per ottenere l'elenco completo delle operazioni.

          <h2>Impossibile trovare il metodo</h2>

          Impossibile trovare il metodo 'GetElencoDocTutti?username=xxxxx' nel servizio Service.

      </span>



    

  </body>

</html>

Non capisco sembra che non prenda il secondo parametro
 

Emme Developer

Well-Known Member
Licensed User
Longtime User
Non capisco sembra che non prenda il secondo parametro
Una bella domanda... il codice sembra scritto giusto.. Non puoi provare a forzare la chiamata mettendo i parametri nell'url?
B4X:
syncJob.Download($"${ServiceSite }?ursername=${User}password=${Pass}"$)
 

ildalla83

Member
Licensed User
Non ho tanta voglia di leggere (giornataccia, perfino peggio del solito :(:D) ma a occhio pare che abbia considerato tutta la stringa, compreso il parametro username, come il metodo da eseguire.

Questo è il comando utilizzato
B4X:
syncJob.Download2(ServiceSite, Array As String("username",User,"password",Pass))
 
Top