.NET6升级至.NET8后Function App运行时错误排查求助
.NET 6 Function App升级至.NET 8后运行时加载程序集失败
问题描述
将.NET 6 Function App项目升级至.NET 8后,项目编译成功,但启动时控制台出现运行时错误。已更新所有相关NuGet包及依赖项,以下是相关文件及错误信息:
控制台错误信息
[2025-01-16T07:18:31.016Z] Error configuring services in an external startup class. [2025-01-16T07:18:31.017Z] Error configuring services in an external startup class. Grpc.AspNetCore.Server: Could not load file or assembly 'Microsoft.AspNetCore.Routing, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified. [2025-01-16T07:18:31.073Z] A host error has occurred during startup operation '9765373b-601a-439f-a34a-cedf62160bf5'. [2025-01-16T07:18:31.074Z] Microsoft.Azure.WebJobs.Script: Error configuring services in an external startup class. Grpc.AspNetCore.Server: Could not load file or assembly 'Microsoft.AspNetCore.Routing, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified. Value cannot be null. (Parameter 'provider')
升级前的.csproj文件
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> <UserSecretsId>fc83650f-36c6-4633-8e47-31d7168e76ae</UserSecretsId> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.ApplicationInsights" Version="2.21.0" /> <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" /> <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.8.1" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" /> <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" /> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.5.0" /> <PackageReference Include="PEMS.Core" Version="2.0.6" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\UserAccountService.Shared\UserAccountService.Shared.csproj" /> </ItemGroup> <ItemGroup> <None Update="host.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="local.settings.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> </Project>
升级后的.csproj文件
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <AzureFunctionsVersion>v4</AzureFunctionsVersion> <UserSecretsId>fc83650f-36c6-4633-8e47-31d7168e76ae</UserSecretsId> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.ApplicationInsights" Version="2.22.0" /> <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" /> <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.13.0" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.1" /> <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="9.0.1" /> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.6.0" /> <PackageReference Include="PEMS.Core" Version="2.0.6" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\UserAccountService.Shared\UserAccountService.Shared.csproj" /> </ItemGroup> <ItemGroup> <None Update="host.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="local.settings.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> </ItemGroup> </Project>
Startup.cs文件
using Microsoft.ApplicationInsights; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.AspNetCore.Identity; using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using PEMS.Core; using PEMS.Core.Configurations; using PEMS.Core.Messaging; using PEMS.UserAccountService.Shared.Contracts; using PEMS.UserAccountService.Shared.Contracts.CoreData; using PEMS.UserAccountService.Shared.Contracts.System; using PEMS.UserAccountService.Shared.Models.DBModels; using PEMS.UserAccountService.Shared.Models.Documents; using PEMS.UserAccountService.Shared.Models.System; using PEMS.UserAccountService.Shared.Services; using PEMS.UserAccountService.Shared.Services.System; using PEMS.UserAccountService.Shared.Stores; using PEMS.UserAccountService.Shared.Support; using System; using System.Collections.Generic; using System.IO; using System.Reflection; using static PEMS.Core.Messaging.Types.Constants; using static PEMS.UserAccountService.Shared.Constants.Constants; using IdentityUser = PEMS.UserAccountService.Shared.Models.Documents.IdentityUser; [assembly: FunctionsStartup(typeof(PEMS.UserAccountService.Jobs.Startup))] namespace PEMS.UserAccountService.Jobs { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { var configBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) #if DEBUG .AddUserSecrets(Assembly.GetExecutingAssembly(), false) #endif .AddEnvironmentVariables(); var config = configBuilder.Build(); config = configBuilder.Build(); var appInsightsInstrumentationKey = config.GetValue<string>("ApplicationInsightsInstrumentationKey"); var telemetryClientConfig = new TelemetryConfiguration { InstrumentationKey = appInsightsInstrumentationKey }; var environment = config.GetValue<string>("Environment"); var dbConnectionSection = config.GetSection("PEMS-UserAccount-DbConnection"); DbInfo dbConnection = new DbInfo(); dbConnectionSection.Bind(dbConnection); var systemHostUrl = config.GetValue<string>("SystemHostUrl"); var aiHostUrl = config.GetValue<string>("AIHostUrl"); URLInfo urlInfo = new URLInfo { SystemHostUrl = systemHostUrl, AIHostUrl = aiHostUrl }; var systemDefaultLanguage = config.GetValue<string>("SystemDefaultLanguage"); SystemInfo systemInfo = new SystemInfo { SystemDefaultLanguage = systemDefaultLanguage }; builder.Services.AddSingleton(s => dbConnection); builder.Services.AddSingleton(s => urlInfo); builder.Services.AddSingleton<IDocumentDbService, CosmosDbService>(); builder.Services.AddSingleton(s => new SystemInfo { Product = PEMSConstants.Product, Environment = environment }); builder.Services.AddSingleton<ITelemetryInitializer, SystemTelemetryInitializer>(); builder.Services.AddMemoryCache(); builder.Services.AddScoped(s => new TelemetryClient(telemetryClientConfig)); builder.Services.AddScoped<ILoggerService, ApplicationInsightsLoggerService>(); builder.Services.AddScoped<RequestContext>(); builder.Services.AddScoped<ICustomerDataContext, CustomerDataContext>(); builder.Services.AddScoped<ISystemDataContext, SystemDataContext>(); builder.Services.AddScoped<IEventNotificationService, EventNotificationService>(); builder.Services.AddScoped<IUserService, UserService>(); builder.Services.AddScoped<ICoreDataService, CoreDataService>(); builder.Services.AddScoped<IIdentityService, IdentityService>(); builder.Services.AddScoped<IUserPermissionService, UserPermissionService>(); builder.Services.AddScoped<IPermissionService, PermissionService>(); builder.Services.AddScoped<ILookupService, LookupService>(); builder.Services.AddScoped<ICustomerDataContextFactory, CustomerDataContextFactory>(); builder.Services.AddScoped<ICustomTicketStore, InMemoryTicketStore>(); builder.Services.AddScoped<ICustomerService, CustomerService>(); builder.Services.AddScoped<IAIDeviceService, AIDeviceService>(); builder.Services.AddScoped<IConfigurationService, ConfigurationService>(); var serviceBusOperationTimeoutInSeconds = config.GetValue<int>("ServiceBusOperationTimeoutInSeconds"); builder.Services.AddSystemMessagePublishing( config.GetValue<string>("ServiceBusConnectionString"), config.GetValue<string>("GeneralTopicName"), string.Empty, ServiceOrigins.UserAccountService, TimeSpan.FromSeconds(serviceBusOperationTimeoutInSeconds)); builder.Services.AddScoped<UserManager<IdentityUser>>(); builder.Services.AddScoped<IUserStore<IdentityUser>, DocumentDbUserStore<IdentityUser>>(); builder.Services.AddScoped<IRoleStore<DocumentDbIdentityRole>, DocumentDbRoleStore<DocumentDbIdentityRole>>(); builder.Services.AddScoped<ILookupNormalizer, LookupNormalizer>(); JsonConvert.DefaultSettings = () => { return new JsonSerializerSettings() { Converters = new List<JsonConverter>() { new JsonClaimConverter(), new JsonClaimsPrincipalConverter(), new JsonClaimsIdentityConverter(), new JsonAuthenticationTicketConverter() } }; }; } } }
解决方案
1. 强制引入匹配版本的依赖包
错误提示找不到Microsoft.AspNetCore.Routing 7.0.0.0,说明存在版本依赖冲突。直接在升级后的.csproj中添加.NET 8对应的版本引用:
<PackageReference Include="Microsoft.AspNetCore.Routing" Version="8.0.8" />
2. 检查跨项目依赖版本一致性
检查PEMS.Core和UserAccountService.Shared项目,确保它们也已升级至.NET 8,且所有ASP.NET Core相关NuGet包版本统一为8.x。跨项目引用的组件版本必须一致,否则会出现程序集加载错误。
3. 清理重建项目
- 删除项目根目录下的
bin和obj文件夹 - 执行命令:
dotnet clean && dotnet restore - 重新编译并运行项目
4. 修复Startup中的冗余代码
Startup中存在重复的config = configBuilder.Build();调用,移除重复代码以保持配置逻辑清晰:
var config = configBuilder.Build(); // 移除下面这行重复代码 // config = configBuilder.Build();
5. 升级Functions SDK至最新稳定版
当前使用的Microsoft.NET.Sdk.Functions 4.6.0虽支持.NET 8,但可升级至最新稳定版本,避免潜在兼容性问题。
内容的提问来源于stack exchange,提问作者Kanchana Kariyawasam
相关产品推荐
相关产品推荐

