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.

c# Cómo pasar correctamente HttpRequestMessage dentro y devolverlo fuera de una función sin fugas.

Estoy tratando de implementar un cliente de rest api en c#. He creado todas las solicitudes de la siguiente manera:

public async Task<string> CallCreateJob()
{
    HttpRequestMessage requestMessage =
        new HttpRequestMessage(HttpMethod.Post, URL));

    requestMessage.Content = new StringContent("some content");

    var getRequestResponse = await RunCallWithAuth(requestMessage);
    string rawResponse = await getRequestResponse.Content.ReadAsStringAsync();
    return rawResponse;
}        

Pero lo importante es que me gustaría envolver la llamada con autenticación de la siguiente manera:

public async Task<httpresponsemessage> RunCallWithAuth(HttpRequestMessage requestMessage)
{
    requestMessage.Headers.Add("token", getToken()); // Se asume que el token está disponible.
    HttpResponseMessage firstResponse = await client.SendAsync(requestMessage);

    if (firstResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized) 
    {
        if (Refresh()) { // Actualiza el token en la llamada getToken().
            requestMessage.Headers.Add("token", getToken());
            HttpResponseMessage secondResponse = await client.SendAsync(requestMessage);
            if (secondResponse.StatusCode != System.Net.HttpStatusCode.Unauthorized)
                return secondResponse;
            else
                throw new IOException("Could not authenticate");
        }
        else
            throw new IOException("Could not authenticate");
    } 
    else
    {
        return firstResponse;
    }
}

La parte que me preocupa es cuando paso un HttpRequestMessage a una función y devuelvo un objeto HttpResponseMessage desde mi función. Según lo que he leído sobre HttpResponseMessage, parece ser una buena práctica utilizar una declaración de using o usar Dispose cuando ya no lo necesito. Pero no sé lo que hace el estándar de C# al devolver un objeto. ¿Se moverá? ¿O se copiará? ¿Existe alguna forma de asegurarse de que todos los recursos en HttpResponseMessage se gestionen correctamente? Las mismas preguntas se aplican cuando se pasa un objeto a una función. ¿Existen prácticas estándar sobre cómo hacer esto con mensajes http?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Cuando pasas un objeto como parámetro en una función o devuelves un objeto desde una función en C#, se pasa o devuelve por referencia. Esto significa que el objeto en sí no se copia, sino que se pasa una referencia al mismo objeto en la memoria.

    En el caso de HttpResponseMessage, es un objeto desechable, lo que significa que implementa la interfaz IDisposable que proporciona un mecanismo para liberar recursos no administrados como sockets de red y manejadores de archivos. Es una buena práctica desechar objetos desechables cuando ya no se necesitan para evitar fugas de recursos.

    Para asegurarte de que todos los recursos en HttpResponseMessage se manejen correctamente en tu código de ejemplo, puedes usar la declaración using. Por ejemplo:

    public async Task<httpresponsemessage> RunCallWithAuth(HttpRequestMessage requestMessage)
    {
        requestMessage.Headers.Add("token", getToken()); //Se asume que el token está disponible.
        HttpResponseMessage firstResponse;
    
        using (firstResponse = await client.SendAsync(requestMessage))
        {
            if(firstResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized) {
    
                 if (Refresh()) { //Actualiza el token en la llamada a getToken().
                    requestMessage.Headers.Add("token", getToken());
                    HttpResponseMessage secondResponse;
    
                    using (secondResponse = await client.SendAsync(requestMessage))
                    {
                        if(secondResponse.StatusCode != System.Net.HttpStatusCode.Unauthorized)
                            return secondResponse;
                        else
                            throw new IOException("No se pudo autenticar");
                    }
                }
                else
                    throw new IOException("No se pudo autenticar");
            } else{
                return firstResponse;
            }
        }
    }
    

    En este ejemplo, los objetos HttpResponseMessage están envueltos en declaraciones using para asegurar que Dispose se llame en ellos cuando ya no sean necesarios.

    Pasando un objeto HttpRequestMessage en una función es seguro ya que no contiene recursos desechables. Sin embargo, en general, es una buena práctica pasar objetos desechables como parámetros usando la declaración using. De esta manera, el llamador de la función puede ser responsable de desechar el objeto cuando ya no sea necesario.

    En resumen, es una buena práctica usar la declaración using para asegurarte de que objetos desechables como HttpResponseMessage se desechen correctamente cuando ya no sean necesarios. Al pasar un objeto desechable como parámetro, también es una buena práctica usar la declaración using para asegurarte de que el objeto se desecha cuando ya no es necesario.

Comments are closed.