You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:07:32