none
Llamar a método asíncrono de WebApi desde VB (DownloadStringAsync) RRS feed

  • Pregunta

  • Buenas,

    Tengo un aplicación WebForms con VB y estoy tratando de consumir una WebApi desarrollada en C# cuyo método es asíncrono. Me doy cuenta que no estoy obligado a consumirlo también de manera asíncrona, sin embargo tengo problemas si quisiera hacerlo, creo que debo utilizar el método DownloadStringAsync de WebClient pero me tira error la App VB cuando coloco el modificador Async.

    Public Shared Async Function ObtenerCursos(ByVal IdPersona As Integer, ByVal IdPeriodo As Integer, ByVal CodigoSede As String) As Threading.Tasks.Task(Of CursoSeccionCapacitadorRpta)
    	Try
    		Dim url As String = String.Format("{0}{1}/{2}/{3}/{4}", ConfigurationManager.AppSettings.Get("URL_WSCV"), "Encuesta/ObtenerPrincipal", IdPersona, IdPeriodo, CodigoSede)
    		Dim token As String = ConfigurationManager.AppSettings.Get("Token_WSCV")
    		Dim uriURL As New Uri(url)
    
    		Using client As New WebClient()
    
    			client.UseDefaultCredentials = True
    			client.Headers.Add(HttpRequestHeader.Authorization, token)
    			client.Headers.Add(HttpRequestHeader.ContentType, "application/json")
    
    			' Setup Event Handlers
    			AddHandler client.DownloadStringCompleted, AddressOf wcDownloadStringCompleted
    			AddHandler client.DownloadProgressChanged, AddressOf weDownloadProgressChanged
    
    			Await client.DownloadStringAsync(uriURL)
    
    			Return JsonConvert.DeserializeObject(Of CursoSeccionCapacitadorRpta)(respuesta)
    		End Using
    	Catch ex As Exception
    		Throw ex
    	End Try
    End Function
    
    Public Shared Sub weDownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
    	' Get status during download here
    
    End Sub
    
    Public Shared Sub wcDownloadStringCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
    	If e.Cancelled = False AndAlso e.Error Is Nothing Then
    		respuesta = CStr(e.Result)
    	End If
    End Sub

    Pero el método ObtenerCursos tiene el siguiente error. 

    Cannot find all types required by the 'Async' modifier. Are you targeting the wrong framework version, or missing a reference to an assembly?

    Y la línea que hace la llamada con Await tiene el error.

    Expression does not produce a value

    Favor si me orientan cómo debo hacer la llamada de manera asíncrona. Utilizo VS2013 Ultimate.

    Muchas gracias.


    • Editado eduar2083 martes, 7 de mayo de 2019 15:12
    martes, 7 de mayo de 2019 15:07

Respuestas

  • A juzgar por el error que te sale, parece que tu proyecto en VB esta construido con una version antigua del Framework, que no soporta el Async/Await. Puedes comprobar la version desde las Propiedades del Proyecto.

    Si fuera asi (el proyeto esta configurado para una version antigua), no te preocupes y utiliza tranquilamente el DownLoadString. El hecho de que el servidor este programado con un metodo de tipo async no guarda absolutamente ninguna relacion con que se consuma con un metodo Async. Todas las combinaciones son posibles: puedes consumir con o sin Async un metodo que en el servidor sea o no sea async, sin que se note ninguna diferencia en el protocolo de llamada. Es decir, el cliente que hace la lamada no tiene ninguna forma de saber ni puede detectar de ninguna manera si el servidor es o no es async. Y similarmente, el servidor no sabe ni puede detectar si el cliente lo esta llamando con un metodo sincrono o asincrono.

    • Propuesto como respuesta Carlos_Ruiz_M martes, 7 de mayo de 2019 15:31
    • Marcado como respuesta eduar2083 martes, 7 de mayo de 2019 15:33
    martes, 7 de mayo de 2019 15:20

Todas las respuestas

  • A juzgar por el error que te sale, parece que tu proyecto en VB esta construido con una version antigua del Framework, que no soporta el Async/Await. Puedes comprobar la version desde las Propiedades del Proyecto.

    Si fuera asi (el proyeto esta configurado para una version antigua), no te preocupes y utiliza tranquilamente el DownLoadString. El hecho de que el servidor este programado con un metodo de tipo async no guarda absolutamente ninguna relacion con que se consuma con un metodo Async. Todas las combinaciones son posibles: puedes consumir con o sin Async un metodo que en el servidor sea o no sea async, sin que se note ninguna diferencia en el protocolo de llamada. Es decir, el cliente que hace la lamada no tiene ninguna forma de saber ni puede detectar de ninguna manera si el servidor es o no es async. Y similarmente, el servidor no sabe ni puede detectar si el cliente lo esta llamando con un metodo sincrono o asincrono.

    • Propuesto como respuesta Carlos_Ruiz_M martes, 7 de mayo de 2019 15:31
    • Marcado como respuesta eduar2083 martes, 7 de mayo de 2019 15:33
    martes, 7 de mayo de 2019 15:20
  • Alberto gracias por tu respuesta.

    Observo que el proyecto tiene la versión 4 del Net Framework y según estoy leyendo, efectivamente, esta característica no está soportada para esta versión. Haré el consumo del servicio de manera síncrona.

    Muchas gracias. Saludos.

    martes, 7 de mayo de 2019 15:33