es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Múltiples llamadas asíncronas, cómo lidiar con las respuestas de una manera que tenga sentido.

Estoy realizando múltiples llamadas asíncronas a un par de URL diferentes, ambas URL deberían devolver el mismo resultado, pero me gustaría comparar los resultados de ambas o buscar valores específicos en las respuestas. No estoy seguro de cómo comparar o buscar valores específicos en las respuestas fuera de los códigos de estado, ¿hay alguna manera fácil de hacer esto? También me gustaría tomar nota de la respuesta y, si falla, poder realizar un seguimiento de eso más tarde en mi código para no usar esa URL nuevamente, y no estoy seguro de cómo hacerlo.

Código:

private async Task<clientmodel> getClientInfoAsync(string clientID)
{

    ClientModel c = null;

    try
    {

        var client = new HttpClient();
        // Iniciar solicitudes para todos ellos
        var requests = urls.Select
            (
            url => client.GetAsync(getURL(url, "Cliente", clientID))
            ).ToList();
        // Esperar a que terminen todas las solicitudes
        await Task.WhenAll(requests);

        // Obtener las respuestas
        var responses = requests.Select
            (
                task => task.Result
            );

        foreach (var r in responses)
        {

            // Extraer el cuerpo del mensaje
            var s = await r.Content.ReadAsStringAsync();                    

            if (r.IsSuccessStatusCode)
            {
                c = r.Content.ReadAsAsync<clientmodel>().Result;                        
                SetLastSuccessfulCommunicationDetails();  //después de esta llamada AQUÍ ES DONDE CREO QUE COMPARARÍA LAS RESPUESTAS Y CONTINUARÍA A PARTIR DE AHÍ                     

            }

        }

    }
    catch (Exception ex)
    {
        string errMsg = "Error obteniendo la información del cliente";
        //...capturar código de error aquí...
    }

    return c;
}

Básicamente, no estoy seguro de cómo manejar las respuestas y solo devolver un modelo de cliente (c) en función de mi comparación y estado de la respuesta. Avísame si necesito incluir más información.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para comparar las respuestas y verificar valores específicos, puedes utilizar el paquete Newtonsoft.Json para deserializar las respuestas en objetos con los que puedas trabajar. Luego puedes comparar los objetos o buscar ciertos valores dentro de ellos.

    Aquí tienes algo de código que podría ayudar con eso:

    using Newtonsoft.Json;
    
    ...
    
    foreach (var r in responses)
    {
        // Extrae el cuerpo del mensaje como una cadena de caracteres
        var contentString = await r.Content.ReadAsStringAsync();
    
        if (r.IsSuccessStatusCode)
        {
            // Deserializa la respuesta a un objeto ClientModel
            var client = JsonConvert.DeserializeObject<clientmodel>(contentString);
    
            // Compara los valores de las dos respuestas
            if (c == null)
            {
                c = client;
            }
            else
            {
                if (c.SomeProperty == client.SomeProperty)
                {
                    // Haz algo si los valores son iguales
                }
                else
                {
                    // Haz algo si los valores son diferentes
                }
            }
    
            SetLastSuccessfulCommunicationDetails();  
        }
        else
        {
            // Maneja el fallo de la solicitud
            // Lleva un registro de la URL fallida en una lista o diccionario para usarla más tarde
        }
    }
    
    

    También puedes considerar el uso de un diccionario para llevar un registro del estado de la respuesta y los objetos de respuesta, de modo que puedas acceder fácilmente a ellos más tarde en función de la URL.

    “`csharp
    var responseDict = new Dictionary<string, (bool=”” success,=”” clientmodel=”” response)=””>();

    foreach (var r in responses)
    {
    var contentString = await r.Content.ReadAsStringAsync();

    bool isSuccess = r.IsSuccessStatusCode;
    
    if (isSuccess)
    {
        var client = JsonConvert.DeserializeObject<clientmodel>(contentString);
    
        responseDict[r.RequestMessage.RequestUri.ToString()] = (success: true, response: client);
    
        SetLastSuccessfulCommunicationDetails();
    }
    else
    {
        responseDict[r.RequestMessage.RequestUri.ToString()] = (success: false, response: null);
    
        // Lleva un registro de la URL fallida
    }
    

    }

    // Accede a las respuestas de esta manera:
    var response = responseDict[url].response;
    “`</string,>

Comments are closed.