ASP.NET Core 5 API escribe archivos en el espacio de disco de Azure Web App
Tengo una ASP. NET Core 5 API web proyecto que actualmente se celebra como Azure Web App on a Plan Windows App Service. Desde Tengo un par de gigabytes de almacenamiento asociados con el plan App Service, quiero usar 10 GB para un caché de imagen donde guardo imágenes generadas por la API.
Aquí hay un contexto:
- No quiero utilizar Azure Storage / Blob Storage para evitar costos y retrasos innecesarios de tráfico. Algunas imágenes se generan a partir de múltiples capas de otras imágenes (llamemos imágenes intermedias) y caché todo.
- Mi solución de caché funciona bien localmente, pero actualmente no en Azure.
- Quiero utilizar 'Remove archivos adicionales en el destino' cuando publique una nueva versión de mi API.
- El cache será despejado/invalidado a través de una llamada API, no en el despliegue o reiniciar la aplicación.
Como he dicho, el caché funciona bien si corro localmente en IIS Express. Por lo que sé, el plan Windows App Service utiliza Kestrel para hospedarse. Estoy buscando un camino de almacenamiento dentro de la aplicación web de Azure, donde puedo crear y eliminar directorios + crear/read/delete archivos.
Dado que el Plan de Servicio de Aplicación es B1, el plan App Service se ejecuta en un Azure VM dedicado, según los documentos: https://learn.microsoft.com/en-us/azure/app-service/overview-hosting-plans
Desde https://learn.microsoft.com/en-us/azure/app-service/operating-system-functionalityHe aprendido que hay una unidad C y una unidad D también.
Desde mi aplicación web, puedo seleccionar Herramientas de Desarrollo - título Herramientas de Avances - título Ve a ver a Kudu. Cuando hago clic en Medio Ambiente en Kudu, puedo ver algunos caminos absolutos a los que he tratado de escribir sin éxito. También he intentado acceder
- Medio ambiente.GetEnvironmentVariable("HOME")
- IWebHostEnvironment.WebRootPath
- IWebHostEnvironment.ContentRootPath
- "D:\home\site\wwwroot"
- "D:\home\"
sin éxito también.
También intenté añadir un directorio virtual (ya que quiero almacenar imágenes en otro directorio para poder utilizar la opción 'remove archivos adicionales en destino'). También he conectado vía FTP a /site/wwwroot/
donde puedo ver mi aplicación desplegada.
En el pasado, pude leer archivos de un directorio virtual de un ASP. NET Webforms aplicación, pero con este ASP. NET Core 5 API project, No tenía ningún éxito mapeando caminos relativos a caminos absolutos.
Mi pregunta principal es: ¿Qué ruta absoluta a la que necesito utilizar en mi proyecto API para crear/deletar permisos de directorio y crear/read/delete permiso de archivo en mi aplicación web de Azure?
Pregunta hecha hace 3 años, 5 meses, 5 días - Por codeglitch
3 Respuestas:
-
Vale, lo he descubierto. Tuve algunos errores fatales al iniciar la aplicación. Parece que estaban relacionados con ApplicationInsights. Lo quité completly del Portal Web Azure y ahora todo funciona.
El siguiente camino funciona como un camino base
D:\\home\\
Respondida el Dec 18, 2020 a las 10:13 - por debugdragon
Votos positivos: 0 | Votos negativos: 0 -
Para poder escribir archivos en el espacio de disco de una Azure Web App en ASP.NET Core, puedes utilizar el siguiente enfoque:
- En tu código ASP.NET Core, puedes utilizar el objeto `IWebHostEnvironment` para acceder a la ruta de la carpeta wwwroot de tu aplicación. Puedes utilizar `IWebHostEnvironment.WebRootPath` para obtener la ruta absoluta a la carpeta wwwroot. Por ejemplo:
csharp string wwwRootPath = _hostEnvironment.WebRootPath;
- Con la ruta de la carpeta wwwroot puedes construir rutas relativas para crear, leer y eliminar archivos. Por ejemplo, si deseas crear un archivo en la carpeta wwwroot, puedes hacerlo de la siguiente manera:
csharp string filePath = Path.Combine(wwwRootPath, "nombre-archivo.txt"); File.WriteAllText(filePath, "Contenido del archivo");
- Para crear y eliminar directorios, puedes utilizar métodos como `Directory.CreateDirectory()` y `Directory.Delete()`. Por ejemplo, para crear un directorio en la carpeta wwwroot puedes hacer lo siguiente:
csharp string newDirectoryPath = Path.Combine(wwwRootPath, "nuevo-directorio"); Directory.CreateDirectory(newDirectoryPath);
- Asegúrate de que la aplicación tenga los permisos necesarios para leer y escribir en la carpeta wwwroot. En Azure Web App, por defecto, la aplicación debería tener los permisos necesarios para acceder a la carpeta wwwroot.
Al utilizar este enfoque, podrás crear, leer y eliminar archivos en el espacio de disco de tu Azure Web App en ASP.NET Core. Recuerda que Azure Web App tiene ciertas restricciones en cuanto al almacenamiento local y los archivos pueden perderse si el servidor se reinicia o escala. Por lo tanto, es importante considerar un mecanismo secundario de cacheo o almacenamiento si los datos son críticos.
Respondida el Dec 19, 2020 a las 10:13 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Ruta para archivos en Azure Web App
La ruta absoluta para archivos en una Azure Web App varía dependiendo del plan de hospedaje:
Plan de Servicio de Aplicaciones de Windows:
D:\home\site\wwwroot
Plan de Servicio de Aplicaciones de Linux:/home/site/wwwroot
Acceso a archivos desde ASP.NET Core 5 API
Para acceder a archivos desde tu API de ASP.NET Core 5, utiliza la interfaz
IHostingEnvironment
. Observa lo siguiente:WebRootPath
devuelve la ruta física a la carpetawwwroot
de tu proyecto.ContentRootPath
devuelve la ruta física a la carpeta raíz de tu proyecto.Creación y eliminación de directorios
Para crear un directorio, utiliza
Directory.CreateDirectory()
. Para eliminar un directorio, utilizaDirectory.Delete()
. Ambas funciones requieren rutas absolutas:csharp // Crear directorio Directory.CreateDirectory(Path.Combine(webHostEnvironment.WebRootPath, "cache")); // Eliminar directorio Directory.Delete(Path.Combine(webHostEnvironment.WebRootPath, "cache"));
Creación, lectura y eliminación de archivos
Para leer y escribir archivos, utiliza la clase
File
. Para eliminar archivos, utilizaFile.Delete()
. También requieren rutas absolutas:csharp // Crear archivo using (var stream = File.Create(Path.Combine(webHostEnvironment.WebRootPath, "cache", "image.jpg"))) { // Escribir datos en el archivo } // Leer archivo using (var stream = File.OpenRead(Path.Combine(webHostEnvironment.WebRootPath, "cache", "image.jpg"))) { // Leer datos del archivo } // Eliminar archivo File.Delete(Path.Combine(webHostEnvironment.WebRootPath, "cache", "image.jpg"));
Ejemplo completo
csharp using Microsoft.AspNetCore.Hosting; using System.IO; public class ImageCacheService { private readonly IWebHostEnvironment _webHostEnvironment; public ImageCacheService(IWebHostEnvironment webHostEnvironment) { _webHostEnvironment = webHostEnvironment; } public void CreateCacheDirectory() { Directory.CreateDirectory(Path.Combine(_webHostEnvironment.WebRootPath, "cache")); } public void SaveImage(string imageName, Stream imageStream) { using (var stream = File.Create(Path.Combine(_webHostEnvironment.WebRootPath, "cache", imageName))) { imageStream.CopyTo(stream); } } public Stream GetImage(string imageName) { return File.OpenRead(Path.Combine(_webHostEnvironment.WebRootPath, "cache", imageName)); } public void DeleteImage(string imageName) { File.Delete(Path.Combine(_webHostEnvironment.WebRootPath, "cache", imageName)); } }
Respondida el Dec 19, 2020 a las 10:21 - por Gemini
Votos positivos: 0 | Votos negativos: 0