none
Metodo async nunca retorna resultado RRS feed

  • Pregunta

  • Hola

    Tengo el siguiente método async el cual no retorna data:

    Metodo async:

    GetClient()
            {
                HttpClientBase clientBase = new HttpClientBase();
                UserEntity result = clientBase.GetAsync<UserEntity>(url).GetAwaiter().GetResult();
                return result;
    }
            public async Task<UserEntity> GetAsync(string api)
            {
                HttpResponseMessage response = await httpClient.GetAsync(url);
                if (response.IsSuccessStatusCode)
                {
                    response.EnsureSuccessStatusCode();
                    string responseBody = await response.Content.ReadAsStringAsync();
                    var data = JsonConvert.DeserializeObject<UserEntity>(responseBody);
                    return data;
                }
                return default(T);
            }

    El método GetAsync nunca retorna, estoy usando MVC, framework 4.5.2 en Visual Studio 2012.

    Saludos
    jueves, 26 de abril de 2018 12:35

Todas las respuestas

  • hola

    que son estos metodos GetAwaiter() GetResult()  ? deberias usar await para esperar al GetAsync() porque sino que sentido tiene devolver un Task<UserEntity>, porque no solo un UserEntity

    Ademas de donde sale url ? porque en GetAsync() defines un parametro "api" que no utilizas, no deberia ser

    HttpResponseMessage response = await httpClient.GetAsync(api);

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 26 de abril de 2018 12:56
  • hola

    que son estos metodos GetAwaiter() GetResult()  ? deberias usar await para esperar al GetAsync() porque sino que sentido tiene devolver un Task<UserEntity>, porque no solo un UserEntity

    Ademas de donde sale url ? porque en GetAsync() defines un parametro "api" que no utilizas, no deberia ser

    HttpResponseMessage response = await httpClient.GetAsync(api);

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola

    Son simples métodos que se usan para llamar a uno asincrono desde otro que no es asyn. Ver más:

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

    Lo de la url o api fue error al escribir el post, sin embargo es irrelevante, simplemente va a tener la url del api.

    El error de fondo es el mismo y es que nunca retorna el resultado al metodo que no es async.

    jueves, 26 de abril de 2018 14:20
  • si analizas el ejemplo

    static async Task<Product> GetProductAsync(string path)
            {
                Product product = null;
                HttpResponseMessage response = await client.GetAsync(path);
                if (response.IsSuccessStatusCode)
                {
                    product = await response.Content.ReadAsAsync<Product>();
                }
                return product;
            }

    veras que devuelve un Task porque el ReadAsAsync es asincrono, en tu caso no lo es porque devuelve una serializacion

    podrias ver algo como ser

    public async UserEntity GetAsync(string api)
    {
    	UserEntity user = null;
    	
    	HttpResponseMessage response = await httpClient.GetAsync(api);
    	if (response.IsSuccessStatusCode)
    	{
    		string responseBody = await response.Content.ReadAsStringAsync();
    		
    		user = JsonConvert.DeserializeObject<UserEntity>(responseBody);
    	}
    
    	return user;
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 26 de abril de 2018 14:36
  • si analizas el ejemplo

    static async Task<Product> GetProductAsync(string path)
            {
                Product product = null;
                HttpResponseMessage response = await client.GetAsync(path);
                if (response.IsSuccessStatusCode)
                {
                    product = await response.Content.ReadAsAsync<Product>();
                }
                return product;
            }

    veras que devuelve un Task porque el ReadAsAsync es asincrono, en tu caso no lo es porque devuelve una serializacion

    podrias ver algo como ser

    public async UserEntity GetAsync(string api)
    {
    	UserEntity user = null;
    	
    	HttpResponseMessage response = await httpClient.GetAsync(api);
    	if (response.IsSuccessStatusCode)
    	{
    		string responseBody = await response.Content.ReadAsStringAsync();
    		
    		user = JsonConvert.DeserializeObject<UserEntity>(responseBody);
    	}
    
    	return user;
    }

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    El método del ejemplo retorna un Task<Product> el cual internamente usa ReadAsAsync mientras que el mio retorna un Task<User> e internamente uso ReadAsStringAsync que también es Async, si se deserializa internamente o no, no tiene que ver.

    Por otra parte el método que me propones no compila ya que no podría usar await, ya que para ello debe ser dentro de un método async el cual retorne un Task o void.

    Como comenté mi problema es que la respuesta se pierde y nunca está llegando a mi método sincronoco.

    Saludos

    jueves, 26 de abril de 2018 18:05
  • hola

    >>Por otra parte el método que me propones no compila ya que no podría usar await

    ok pero mas alla de definir el Task, no necesitas el default

    >>Como comenté mi problema es que la respuesta se pierde y nunca está llegando a mi método sincronoco.

    pero entonces define un try..catch para capturar el problema y valida la url que usas quizas sea incorrecta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 26 de abril de 2018 19:10
  • hola

    >>Por otra parte el método que me propones no compila ya que no podría usar await

    ok pero mas alla de definir el Task, no necesitas el default

    >>Como comenté mi problema es que la respuesta se pierde y nunca está llegando a mi método sincronoco.

    pero entonces define un try..catch para capturar el problema y valida la url que usas quizas sea incorrecta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    El metodo no lanza excepción, ya lo puse dentro de un try / catch y nada :S Simplemente se pierde. No entiendo que pasa porque según la documentación debería funcionar lo que estoy haciendo, pero no logro que mi método sincrono pueda obtener la respuesta del método asyncrono. De hecho la verdad ni entiendo porque HttpClient incorpora el método de forma async.
    viernes, 27 de abril de 2018 12:27