79 messaggi dal 19 ottobre 2005
dev.to
santonim ha scritto:
Esatto. Prima del tuo post ho usato l'istruzione come quella da te suggerita e funziona.
Ora mi ritorna 200 e fino qui va bene.

Ora c'è il problema di leggere la risposta; a seguire la routine che ho creato e dove l'oggetto oContent ritorna Nothing

Public Async Sub SubSignin()
Dim oClient As New Net.Http.HttpClient
Dim oRequest As New Net.Http.HttpRequestMessage
Dim oContent As Net.Http.HttpContent

Try
oRequest.RequestUri = New Uri(Usr_Xml_csUrlAutDemo & "/auth/signin")
oRequest.Content = New Net.Http.StringContent("username=" & Usr_Xml_csApiUser & "&password=" & Usr_Xml_csApiPassword & "&grant_type=" & Usr_Xml_csApiPassword)

Try
oResponseMessage = Await oClient.SendAsync(oRequest)
Catch ex As Exception
End Try

oContent = oResponseMessage.Content

Catch ex As Exception
Beep()
End Try
End Sub


La proprietà Content è di tipo HttpContent quindi ti espone il metodo ReadAsStream. Lo puoi usare per recuperare uno Stream della risposta e leggerlo ad esempio con uno StreamReader.

Ti faccio un esempio (con C# 9.0 e .NET 5.0, mi sono ricordato dopo che usi VB.NET, ma non credo avrai problemi a convertirlo)

using HttpClient client = new HttpClient();
using HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, @"https://www.google.it/");
using HttpResponseMessage res = client.Send(req);

if (res.IsSuccessStatusCode)
{
    using StreamReader sr = new StreamReader(res.Content.ReadAsStream());
    string buffer = sr.ReadToEnd();
}


Ciao.
Modificato da santoni1981 il 09 settembre 2021 09:46 -
79 messaggi dal 19 ottobre 2005
dev.to
santonim ha scritto:
Cosa strana: il code 200 lo ricevo anche se la passowrd è errata o se uso una Content diversa: ho provato con questo:

oRequest.Content = New Net.Http.StringContent("grant_type=" & Usr_Xml_csApiPassword & "&username=" & Usr_Xml_csApiUser & "&password=" & Usr_Xml_csApiPassword)

e torna 200; il che mi fa presupporre che la "SendAsync" non sia l'istruzione corretta


SendAsync e la controparte sincrona Send vanno bene: servono per inviare al request al server. Il fatto che ti torna 200 dipende da come è stato sviluppato il web service, io le specifiche che hai postato non le ho viste quindi non so cosa dicono.
15 messaggi dal 09 maggio 2005
Ciao
Dopo una serie di tentativi riesco a mandare in POST, dove ricevo l'errore 400 ma di questo ho chiesto ad Aruba.

Nel tuo codice utilizzi la classe HttpClient che però nel mio caso non ha il metodo "Send" ma solo "SendAsync"

Per la lettura di conseguenza utilizzo "ReadAsStringAsync" che va bene quando sono in debug stepebystep, mentre a ciclo continuo no.

Come posso fare per sapere quando il metodo asincrono è terminato?
79 messaggi dal 19 ottobre 2005
dev.to
Come ti ho scritto l'esempio è basato su .NET 5.0, il metodo Send è disponibile a partire da questa versione.




SendAsync, essendo un metodo asincrono devi utilizzare il pattern Async/Await. Metti await prima della chiamata del metodo SendAsync. Ho riscritto l'esempio in VB.NET.

Sub Main(args As String())
    SendRequest().Wait()
End Sub

Async Function SendRequest() As Task
    Dim client As HttpClient = New HttpClient()
    Dim req As HttpRequestMessage = New HttpRequestMessage()

    req.Method = HttpMethod.Get
    req.RequestUri = New Uri("https://www.google.it/")

    Dim res As HttpResponseMessage = Await client.SendAsync(req)

    If res.IsSuccessStatusCode Then
        Dim sr As StreamReader = New StreamReader(Await res.Content.ReadAsStreamAsync())
        Dim buffer As String = sr.ReadToEnd()
    End If
End Function


Nota la dichiarazione del metodo SendRequest, è preceduta da Async e ritorna Task mentre la chiamata del metodo SendAsync è preceduta da Await. Anche il metodo ReadAsStreamAsync è asincrono quindi anche lui è preceduto da Await. Inoltre, la chiamata del metodo SendRequest nel metodo Main, ritorna un oggetto di tipo Task che espone il metodo Wait.

Essendo un argomento un po' vasto è difficile spiegarlo in un post del forum. Ti consiglio di dare un occhio alla documentazione.

https://docs.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap

Ciao.
Modificato da santoni1981 il 09 settembre 2021 11:59 -
15 messaggi dal 09 maggio 2005
Ciao, utilizzo VS2019 in vb e .Net 4.7.2

Ma ad ogni modo ho provato come da tue indicazioni: se testo "buffer" nella function vedo il contenuto, ma se lo faccio nella Main subito dopo SendRequest().Wait() è vuoto (wait lo impostato a 1000 ma anche con 5000 non cambia)

Darò uno sguardo alla documentazione che mi hai inoltrato

Grazie per il momento
79 messaggi dal 19 ottobre 2005
dev.to
Non ho capito cosa non va.
Che cosa fai nella Main?
15 messaggi dal 09 maggio 2005
Se nella SendRequest() interrogo con una MsgBox il contenuto di buffer lo vedo

se la MsgBox la posiziono nella Main dopo la SendRequest() il messaggio è vuoto

Dato che ho delle attività da fare sul database volevo avere un ritorno dalla SendRequest() per avviare altre routine

Ma ho appena provato a passare nella SendRequest() una TextBox e mi viene aggiornata, per cui la soluzione è quella da fare le attività sul database nella SendRequest() e visualizare il risultato nella TextBox.

Che ne pensi?

Ciao
79 messaggi dal 19 ottobre 2005
dev.to

Se nella SendRequest() interrogo con una MsgBox il contenuto di buffer lo vedo

se la MsgBox la posiziono nella Main dopo la SendRequest() il messaggio è vuoto


Nell'esempio che ti ho riportato la variabile buffer è dichiarata all'interno del metodo SendRequest e quindi non è visibile fuori. Per utilizzarlo all'esterno devi o utilizzare una variabile globale che viene valorizzata all'interno del metodo SendRequest (sconsigliato) oppure fare in modo che la funzione SendRequest ti ritorni il valore (nel nostro esempio buffer).




Penso che sia un po' una scelta di progettazione, io ti consiglio di far restituire il valore di buffer alla funzione e tenere separata la logica che si occupa di interagire con il servizio web dalla logica di gestione del database.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.