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

.NET 6升级至.NET 8时加载Microsoft.Extensions.Configuration失败求助

.NET 8.0升级后Cosmos变更提要函数依赖冲突问题

我正尝试将API仓库从.NET 6.0升级到.NET 8.0,同时把Cosmos数据库SDK从2.13.1升级到3.35.4。API和数据库本身升级看起来没问题,但本地测试变更提要(Change Feed)函数时出现依赖冲突错误。这是我们首个升级到.NET 8.0的仓库,属于首次尝试。

错误信息

无法加载类型'Microsoft.Extensions.Configuration.IConfigurationRoot',程序集'Microsoft.Extensions.Configuration.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'中不存在该类型。

已尝试操作

  • 检查所有NuGet包,定位Microsoft.Extensions.Configuration的定义位置
  • 手动安装8.0.0版本的Microsoft.Extensions.Configuration包,试图覆盖低版本依赖

冲突来源

领域层的Columbia.Cosmos.Common NuGet包,以及函数层的Microsoft.Azure.Functions.Extensions都引入了Microsoft.Extensions.Configuration,但版本不一致导致冲突。


领域层csproj文件

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
      <GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
    <ImplicitUsings>disable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <Compile Remove="Consumer\**" />
    <EmbeddedResource Remove="Consumer\**" />
    <None Remove="Consumer\**" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="cdtservicecommon" Version="[*,9999.0]" />
    <PackageReference Include="Columbia.Cosmos.Common" Version="3.1.0" />
    <PackageReference Include="Microsoft.ApplicationInsights" Version="2.20.0" />
    <PackageReference Include="Microsoft.Azure.Cosmos" Version="3.46.0" />
    <PackageReference Include="Microsoft.NETCore.App" Version="2.2.8" />

  </ItemGroup>

</Project>

变更提要函数csproj文件

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Azure.Messaging.ServiceBus" Version="7.7.0" />
    <PackageReference Include="Columbia.ServiceBus.Common" Version="2.0.0" />
    <PackageReference Include="csc.azure.datalake.client" Version="4.0.0-preview1" />
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.CosmosDB" Version="3.0.10" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.2.0" />
    <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="6.0.3" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.0.1" />
    <PackageReference Include="Polly" Version="7.2.3" />
    <PackageReference Include="Polly.Contrib.WaitAndRetry" Version="1.1.1" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\cscentconsumer.infrastructure\cscentconsumer.infrastructure.csproj" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

报错函数Startup.cs文件

using CdtServiceCommon.Domain.Interfaces;
using CdtServiceCommon.Infrastructure.Logging;
using Columbia.Cosmos.Common.Extensions;
using Columbia.Cosmos.Common.FaultTolerance;
using csc.azure.datalake.client.Extensions;
using cscentconsumer.domain.Models.Consumer;
using CscEntConsumer.Infrastructure.Configuration;
using CscEntConsumer.Infrastructure.Repository;
using CscEntConsumerFunctions;
using CscEntConsumerFunctions.Configuration;
using CscEntConsumerFunctions.Utilities;
using CscEntConsumerFunctions.Utilities.Interfaces;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;

[assembly: WebJobsStartup(typeof(Startup))]
namespace CscEntConsumerFunctions
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            IConfigurationRoot config = new ConfigurationBuilder()
                                        .SetBasePath(Environment.CurrentDirectory)
                                        .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                                        .AddEnvironmentVariables()
                                        .Build();

            builder.Services.AddDatalakeClient(options => config.Bind(options));

            builder.Services.AddSingleton(config);

            builder.Services.AddCosmosDb(
                config.GetValue<string>("cosmosdb-connection"),
                options =>
                {
                    options.DatabaseId = config["CosmosDb:DatabaseId"];
                    options.Containers = config["CosmosDb:Containers"].Split(',').ToList();
                },
                cosmosResiliencySettings: config.GetValue<CosmosResiliencySettings>("CosmosResiliencySettings"));

            builder.Services.AddOptions();
            builder.Services.Configure<ConsumerServiceDetails>(config.GetSection("ServiceDetails"));
            builder.Services.Configure<DataLakeConfiguration>(config);

            builder.Services.AddSingleton<IModelMasterRepository<Consumer>, ConsumerMasterRepository>();
            builder.Services.AddUpserterAsSingleton<IModelMasterRepository<Consumer>, Consumer, string>();

            builder.Services.AddSingleton<ITelemetryInitializer, TelemetryInitializer>();
            builder.Services.AddSingleton<IMessageBuilderUtility, MessageBuilderUtility>();
        }
    }
}

解决方案建议

1. 统一配置相关包版本

在函数项目的csproj中,显式添加8.0.0版本的配置相关包,强制覆盖所有间接引用的低版本:

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
  <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
</ItemGroup>

2. 升级老旧依赖包

  • 将Microsoft.Azure.Functions.Extensions升级到最新兼容.NET 8的版本(如1.1.0之后的稳定版)
  • 将Microsoft.Azure.WebJobs.Extensions.CosmosDB升级到4.x系列(如4.3.0),该系列原生支持.NET 8
  • 将Microsoft.NET.Sdk.Functions升级到最新的.NET 8兼容版本(如4.2.0或更高)

3. 移除无效包引用

领域层csproj中的Microsoft.NETCore.App版本2.2.8完全多余(目标框架已是net8.0),直接删除该行:

<!-- 移除这一行 -->
<PackageReference Include="Microsoft.NETCore.App" Version="2.2.8" />

4. 使用函数内置配置

在Functions Startup中,无需手动构建IConfigurationRoot,直接使用框架内置的配置对象,避免版本冲突:

public override void Configure(IFunctionsHostBuilder builder)
{
    // 替换手动构建的config为内置配置
    IConfiguration config = builder.GetContext().Configuration;

    // 后续代码保持不变
}

5. 清理并重新还原包

执行以下命令清理缓存并重新同步依赖:

dotnet clean
dotnet nuget locals all --clear
dotnet restore

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:48:09