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, 4 meses, 27 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 carpeta wwwroot 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, utiliza Directory.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, utiliza File.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