teclado reciclaje puede porque por pasar papelera mover mac eliminar elemento definitivamente cómo con carpeta borrar basurero archivos archivo c# stream asp.net-web-api2

c# - reciclaje - ¿Puedo transmitir directamente desde HttpResponseMessage a un archivo sin pasar por la memoria?



eliminar archivos sin pasar por la papelera (1)

Parece que esto es por diseño: si revisa la documentación de HttpClient.GetAsync() verá que dice:

El objeto de tarea devuelto se completará después de leer toda la respuesta ( incluido el contenido )

En su lugar, puede usar HttpClient.GetStreamAsync() que establece específicamente:

Este método no almacena en búfer la secuencia.

Sin embargo , no tienes acceso a los encabezados en la respuesta hasta donde yo pueda ver. Como presumiblemente es un requisito (ya que obtiene el nombre del archivo de los encabezados), puede usar HttpWebRequest que le permite obtener los detalles de la respuesta (encabezados, etc.) sin leer toda la respuesta en la memoria. Algo como:

public async Task<bool> DownloadFile() { var uri = new Uri("http://somedomain.com/path"); var request = WebRequest.CreateHttp(uri); var response = await request.GetResponseAsync(); ContentDispositionHeaderValue contentDisposition; var fileName = ContentDispositionHeaderValue.TryParse(response.Headers["Content-Disposition"], out contentDisposition) ? contentDisposition.FileName : "noname.dat"; using (var fs = new FileStream(@"C:/test/" + fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { await response.GetResponseStream().CopyToAsync(fs); } return true }

Tenga en cuenta que si la solicitud devuelve un código de respuesta fallido, se lanzará una excepción, por lo que es posible que desee envolver una try..catch y devolver false en este caso como en el ejemplo original.

Mi programa usa HttpClient para enviar una solicitud GET a una API web, y esto devuelve un archivo.

Ahora uso este código (simplificado) para almacenar el archivo en el disco:

public async Task<bool> DownloadFile() { var client = new HttpClient(); var uri = new Uri("http://somedomain.com/path"); var response = await client.GetAsync(uri); if (response.IsSuccessStatusCode) { var fileName = response.Content.Headers.ContentDisposition.FileName; using (var fs = new FileStream("C:/test/" + fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { await response.Content.CopyToAsync(fs); return true; } } return false; }

Ahora, cuando se ejecuta este código, el proceso carga todo el archivo en la memoria. En realidad, preferiría que la transmisión se transmite desde HttpResponseMessage.Content a FileStream, de modo que solo una pequeña parte se mantenga en la memoria.

Estamos planeando usar eso en archivos grandes (> 1GB), entonces ¿hay alguna forma de lograr eso sin tener todo el archivo en la memoria?

¿Idealmente sin bucles manuales al leer una porción en un byte [] y escribir esa parte en la secuencia de archivos hasta que se escriba todo el contenido?