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.

Excepción HttpClient ‘La respuesta finalizó prematuramente’ cuando la longitud de la respuesta real no coincide con el encabezado Content-Length.

Cómo puedo solucionar la excepción de HttpClient cuando la longitud real de la respuesta es menor que el encabezado Content-Length

La respuesta terminó prematuramente, se esperaban al menos 4508 bytes adicionales.

La respuesta terminó prematuramente, se esperaban al menos 783 bytes adicionales.

Solucioné esta excepción leyendo el contenido de la respuesta carácter por carácter hasta que ocurra la excepción.

var response = await client.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
var stream = await response.Content.ReadAsStreamAsync();

using var streamReader = new StreamReader(stream);
var content = "";
try
{
    do
    {
        content += (char)streamReader.Read();
    }
    while (!streamReader.EndOfStream);
}
catch (Exception ex)
{
}

pero no creo que esta sea la solución correcta o óptima.

¿Cómo puedo hacer que HttpClient ignore el Content-Length del encabezado de solicitud?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay dos formas posibles de hacer que HttpClient ignore el Content-Length del encabezado de la solicitud:

    1. Usando la propiedad “AutomaticDecompression” de HttpClientHandler:
    var handler = new HttpClientHandler()
    {
        AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
    };
    
    var client = new HttpClient(handler);
    
    var request = new HttpRequestMessage(HttpMethod.Post, uri);
    request.Content = new StreamContent(stream);
    request.Content.Headers.ContentLength = null;
    
    var response = await client.SendAsync(request);
    
    1. Usando un método de extensión de HttpClient:
    public static async Task<httpresponsemessage> PatchAsync(
        this HttpClient client, string requestUri, HttpContent content)
    {
        var method = new HttpMethod("PATCH");
        var request = new HttpRequestMessage(method, requestUri) { Content = content };
        request.Content.Headers.ContentLength = null;
        return await client.SendAsync(request);
    }
    

    Luego úsalo de la siguiente manera:

    csharp
    var response = await client.PatchAsync(uri, new StreamContent(stream));

Comments are closed.