Azure function error configuring services in an external startup class

azure-function-error-configuring-services-external-startup
Inicio » Informática » .Net » Azure function error configuring services in an external startup class

Tabla de contenido

Este error aparece cuando intentamos migrar la versión .NET de una Azure Function de la 6 a la 8 con el tipo de función “in process”.

Los errores encontrados son:

  • Error configuring services in an external startup class.
  • Could not load file or assembly XXX Version=8.0.0.0.

El error se debe, principalmente, a dos motivos:

Versión incorrecta de Microsoft.NET.Sdk.Functions

En un primer momento el error me apareció solo en el entorno local, descripción completa del error:

Error configuring services in an external startup class. XXX.Function: Could not load file or assembly ‘System.Linq, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’. El sistema no puede encontrar el archivo especificado.

Esto se debió a que en el .csproj solo cambié el TargetFramework de la versión de .NET 6 a .NET 8 para migrar la Azure Function:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <AzureFunctionsVersion>v4</AzureFunctionsVersion>                    
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.2.0" />
...

Sin embargo, como podéis observar, la versión de .NET es la 8 pero las Azure Functions tienen una versión antigua, la 4.2.0.

Para solucionar el error hay que cambiar la última línea por la última versión de Azure Functions, ahora mismo es la 4.4.1:

<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.4.1" />

Configurar variables de entorno

Más tarde el error me volvió a aparecer cuando subimos la función a Azure, aunque realizamos los cambios correctamente:

En las notificaciones de la función aparecía el siguiente error:

Microsoft.Azure.WebJobs.Script: Error configuring services in an external startup class. XXX.Function: Could not load file or assembly ‘Microsoft.Extensions.Configuration.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60′. El sistema no puede encontrar el archivo especificado.Value cannot be null. (Parameter ‘provider’)

Pues bien, en este caso es debido a que nos faltan variables de entorno tal y como indica la documentación oficial de Microsoft para migrar una Azure Function in process de .NET 6 a .NET 8:

  • The application setting FUNCTIONS_WORKER_RUNTIME must be set with the value «dotnet».
  • The application setting FUNCTIONS_EXTENSION_VERSION must be set with the value «~4».
  • The application setting FUNCTIONS_INPROC_NET8_ENABLED must be set with the value «1».

Estos cambios debemos aplicarlos en local a través del archivo local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
	"AzureWebJobsStorage": "UseDevelopmentStorage=true",
	"scheduletriggertime": "0 */1 * * * *",
	"FUNCTIONS_INPROC_NET8_ENABLED": "1",
	"FUNCTIONS_WORKER_RUNTIME": "dotnet",
	"FUNCTIONS_EXTENSION_VERSION": "~4"
  },

Y después, a la hora de desplegar, debemos aplicarlos en Azure a través del apartado Configuración, Variables de entorno:

Una vez hecho esto la función de Azure funciona correctamente sin lanzar ninguna notificación ni error.

Versión incorrecta de paquetes Nuget de Microsoft

Supongamos que tenemos la siguiente función:

  • Versión .NET 6.
  • Tipo Http, creada a partir de la plantilla de Microsoft y Visual Studio.
  • Modificada para añadir el Startup.cs e inyección de dependencias utilizando el tutorial enlazado.
  • Finalmente hemos añadido el Nuget <PackageReference Include="Microsoft.Extensions.Http" Version="8.0.1" /> para que podamos añadir un cliente Http en el Startup a través de la línea builder.Services.AddHttpClient();.

Si intentamos ejecutarla aparecerá el siguiente error:

Error configuring services in an external startup class. FunctionApp1: Could not load file or assembly ‘Microsoft.Extensions.Http, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60’. El sistema no puede encontrar el archivo especificado.

El problema que tenemos aquí es que el paquete Nuget que hemos instalado es de la versión .NET 8 mientras que nuestra función utiliza la versión .NET 6. Dicho de otra manera, el entorno de ejecución de las Azure Functions es .NET 6 y dentro de éste no se encuentra el paquete <PackageReference Include="Microsoft.Extensions.Http" Version="8.0.1" />.

Para solucionar el error simplemente bajaremos la versión del paquete Nuget a la versión de .NET que tengamos en la function, en este caso, la versión 6.0.0:

Finalmente destacar un punto importante a tener en cuenta, en este caso el error nos está dirigiendo directamente al paquete que hemos instalado, pero es posible que el error nos muestre un paquete que no hemos instalado directamente porque es una dependencia de otro paquete que sí hemos instalado nosotros.

En este último caso podríamos solucionar el error de dos formas:

  • Instalar una versión más antigua del paquete padre, el que hemos instalado nosotros.
  • Instalar en el proyecto manualmente una versión más antigua de la dependencia que nos aparece en el error.

No obstante, si el error que te aparece es similar a “Could not load file or assembly. The system cannot find the file specified.”, te recomiendo que eches un vistazo al post enlazado donde analizo más en profundidad esta casuística.