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.

Los bytes a escribir en el flujo exceden el tamaño en bytes especificado por Content-Length.

Tengo una API web que carga el contenido del archivo en el servidor.

[HttpPost]
[Route("SaveFileContent")]
public async Task<fileresponse> SaveFileContent([FromForm] SaveFileContentRequest request)
{
   return await _service.SaveFile(request);
}

Este es mi llamado a la API:

public async Task<fileresponse> SaveFileContent(SaveFileContentRequest request)
{
   try
   {
        var uri = "https://www.mycompanyurl.com";

        using (var client = new HttpClient())
        {
            using (var form = new MultipartFormDataContent())
            {
                 using (var fileContent = new ByteArrayContent(request.File))
                 {
                     fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");

                     form.Add(fileContent, "file", request.FileName);
                     form.Add(new StringContent(request.MemberId), "MemberId");
                     form.Add(new StringContent(request.Country), "Country");
                     form.Add(new StringContent(request.Source), "Source");
                     form.Add(new StringContent(request.UserName), "UserName");

                     client.BaseAddress = new Uri(uri);
                     HttpResponseMessage response = await client.PostAsync("/api/Document/SaveFileContent", form);
                     FileResponse result = JsonConvert.DeserializeObject<fileresponse>(response.Content.ReadAsStringAsync().Result);
                     return result;
                }
            }
        }
      }

    catch (Exception ex)
    {
        ex.LogError(ex);
    }
    }

Con esto, se realiza exitosamente la llamada a la API y se guarda el archivo en el servidor.

Sin embargo, cuando agregué 2 nuevos StringContent a MultipartFormDataContent:

  form.Add(new StringContent(request.Source), "Source");
  form.Add(new StringContent(request.UserName), "UserName");

Estoy obteniendo esta excepción:

Bytes por escribir en el flujo exceden el tamaño de bytes especificado en Content-Length.

¿Cómo puedo resolver esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La excepción “Bytes a escribir en el flujo exceden el tamaño en bytes especificado por Content-Length” ocurre cuando el tamaño del cuerpo de la solicitud HTTP excede el valor especificado por el encabezado Content-Length. Esto significa que el tamaño del cuerpo de la solicitud es más grande de lo que el servidor espera.

    Para resolver este problema, debes aumentar el valor del encabezado Content-Length en tu solicitud HTTP. Esto se puede hacer calculando la longitud correcta del cuerpo de la solicitud y estableciendo el valor del encabezado Content-Length en consecuencia.

    Una forma de hacer esto es utilizando el método “GetBytes” de la clase Encoding para calcular la longitud en bytes del cuerpo de la solicitud. Aquí tienes un ejemplo:

    using (var client = new HttpClient())
    {
        using (var form = new MultipartFormDataContent())
        {
            using (var fileContent = new ByteArrayContent(request.File))
            {
                fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
    
                form.Add(fileContent, "file", request.FileName);
                form.Add(new StringContent(request.MemberId), "MemberId");
                form.Add(new StringContent(request.Country), "Country");
                form.Add(new StringContent(request.Source), "Source");
                form.Add(new StringContent(request.UserName), "UserName");
    
                // Calcula la longitud del cuerpo de la solicitud
                var contentLength = Encoding.UTF8.GetBytes(form.ReadAsStringAsync().Result).Length;
                client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Length", contentLength.ToString());
    
                client.BaseAddress = new Uri(uri);
                HttpResponseMessage response = await client.PostAsync("/api/Document/SaveFileContent", form);
                FileResponse result = JsonConvert.DeserializeObject<fileresponse>(response.Content.ReadAsStringAsync().Result);
                return result;
            }
        }
    }
    

    En este ejemplo, calculamos la longitud en bytes del cuerpo de la solicitud utilizando el método GetBytes de la clase de codificación UTF8. Luego, establecemos el valor del encabezado Content-Length utilizando el método TryAddWithoutValidation de la propiedad DefaultRequestHeaders de HttpClient.

    Al aumentar el valor del encabezado Content-Length para que coincida con el tamaño del cuerpo de la solicitud, deberías poder resolver este problema y cargar correctamente tu archivo junto con los nuevos valores de StringContent.

Comments are closed.