Azure Function 3升级至4报错:外部启动类服务配置失败
问题详情
升级Azure Function从v3到v4后,启动时抛出以下错误:
AZFD0005 Diagnostic event Error code AZFD0005 Level Error Message
Error configuring services in an external startup class. Details
Microsoft.Azure.WebJobs.Script.ExternalStartupException : Error configuring services in an external startup class. --->
System.IO.FileNotFoundException : Could not load file or assembly 'Microsoft.Extensions.Identity.Core, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.
at SkyNav.API.Extensions.RegisterServices.AddCustomServices(IServiceCollection services) at /Users/mrogers/_AzureDevOps/SkyNavAPI/src/SkyNav.API/Extensions/RegisterServices.cs : 87
...(省略后续调用栈)
项目核心配置:
- 目标框架:.NET 6.0
- AzureFunctionsVersion:v4
- 直接依赖的
Microsoft.Extensions.Identity.Core版本为6.0.21,未发现直接或间接依赖7.0.0版本。
项目csproj关键片段:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> </PropertyGroup> <ItemGroup> <!-- 其他依赖项 --> <PackageReference Include="Microsoft.Extensions.Identity.Core" Version="6.0.21" /> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.1" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\SkyNav.Core\SkyNav.Core.csproj" /> </ItemGroup> </Project>
错误触发点对应代码(RegisterServices.AddCustomServices第87行):
services.AddScoped(typeof(IPasswordHasher<User>), typeof(PasswordHasher<>));
解决方案
1. 检查SkyNav.Core项目的依赖
由于项目引用了SkyNav.Core,需排查该项目的NuGet依赖:
- 确认是否存在对
Microsoft.Extensions.Identity.Core7.0.0版本的直接/间接引用 - 检查该项目是否有程序集绑定重定向配置,强制指向7.0.0版本
2. 添加程序集绑定重定向
在项目根目录创建app.config文件,配置绑定规则将7.0.0版本指向已安装的6.0.21版本:
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Extensions.Identity.Core" publicKeyToken="adb9793829ddae60" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="6.0.21.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
3. 更新Microsoft.NET.Sdk.Functions版本
当前使用的4.1.1版本可能存在兼容性问题,升级到.NET 6兼容的最新稳定版本(如4.2.0及以上):
dotnet add package Microsoft.NET.Sdk.Functions --version 4.2.0
4. 修正PasswordHasher注册方式
泛型类型PasswordHasher<>的写法可能导致程序集解析异常,改为具体的泛型类型:
services.AddScoped(typeof(IPasswordHasher<User>), typeof(PasswordHasher<User>));
5. 清理重建项目
- 删除项目的
bin和obj文件夹 - 清除NuGet缓存:
dotnet nuget locals all --clear
- 重新还原依赖并构建:
dotnet restore dotnet build
内容的提问来源于stack exchange,提问作者Matthew Rogers

