Cargar archivos locales desde Azure Functions

Lo primero: la forma ideal de trabajar con archivos en un entorno de nube es usando servicios de almacenamiento administrados, por ejemplo, Blob Storage.
Ahora si, vamos con el artículo.

Algunas veces debemos acceder a archivos que hacen parte del proyecto: un .json con valores estáticos, un formato de correo electrónico en .html, una plantilla de hoja de cálculo en .ods, una extensión, etc.

Eso es relativamente sencillo porque C# ofrece la propiedad Environment.CurrentDirectory:

public async Task<string> GetFileContent(string name)
{
    string filePath = Path.Combine(Environment.CurrentDirectory, "Files", name);
    string content = await File.ReadAllTextAsync(filePath);
    return content;
}

Pero este código no funciona en una Azure Function. Para las funciones debemos inyectar el ExecutionContext y después obtener el directorio base con la propiedad FunctionAppDirectory.

[FunctionName("QueueFunction")]
public async Task Run(
    [QueueTrigger("myqueue", Connection = "AzureWebJobsStorage")] string message,
    ExecutionContext exeContext,
    ILogger log)
{
    var baseDir = exeContext.FunctionAppDirectory;
    // ...
}

Modificar el código para que reciba el directorio base como parámetro.

public async Task<string> GetFileContent(string name, string baseDir)
{
    string filePath = Path.Combine(baseDir, "Files", name);
    string content = await File.ReadAllTextAsync(filePath);
    return content;
}

Y no debemos olvidar incluir el directorio en la salida, desde el .csproj.

<ItemGroup>
    <None Include=".\Files\**" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
</ItemGroup>

Comentarios

Entradas más populares de este blog

Historia de una App: un mes en la Tienda Windows y en Google Play

El Meetup de enero en CaliSharp

El nuevo sistema de autenticación de ASP.NET