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

Azure Function中MassTransit消费者注入EF Core DbContext报错

问题现象
  • Azure Function中部署的MassTransit消费者可正常接收、消费消息,全局依赖注入功能运行正常
  • 仅在消费者中注入EF Core DbContext时会触发崩溃,抛出如下类型加载异常:
Microsoft.EntityFrameworkCore: 
Could not load type 'Microsoft.Extensions.DependencyInjection.ServiceCollection' from assembly 
'Microsoft.Extensions.DependencyInjection, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
  • 已在Startup中完成DbContext注册,所有原生Azure函数均可正常注入该DbContext,仅MassTransit消费者注入失败,其余注册为Transient、Scoped生命周期的服务均可在消费者中正常注入。
相关代码片段

服务注册代码

builder.Services.AddDbContext<ReadOnlyMainDataDBContext>(options =>
{
   options.UseSqlServer(config.GetConnectionString("ReadOnlyMainData"), opt => { });
});
....
builder.Services
       .AddMassTransitForAzureFunctions(cfg =>
        {
                cfg.AddConsumer<MyMTConsumer>();
                cfg.AddRequestClient<IUpdateEvent>(new Uri("queue:my-queue"));
            }, "ServiceBusConnectionString");
builder.Services.AddScoped<MyMTConsumer>();

消费者实现代码

public class MyMTConsumer : IConsumer<IUpdateEvent>
{
    private readonly ILogger<IUpdateEvent> _logger;
    private readonly ReadOnlyMainDataDBContext _dbContext
    public AlertRuleRefreshCacheConsumer(
        ReadOnlyMainDataDBContext dbContext,
        ILogger<ITempBandUpdateEvent> logger)
    {
        _logger = logger;
        _dbContext = dbContext;
    }

    public async Task Consume(ConsumeContext<IUpdateEvent> context)
    {
        ....
    }
}

完整错误堆栈

Type: System.TypeLoadException
Stack Trace:
Could not load type 'Microsoft.Extensions.DependencyInjection.ServiceCollection' from assembly 'Microsoft.Extensions.DependencyInjection, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.<GetOrAdd>g__BuildServiceProvider|3()
at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.<>c__DisplayClass4_0.<GetOrAdd>b__2(Int64 k)
at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache.GetOrAdd(IDbContextOptions options, Boolean providerRequired)
at Microsoft.EntityFrameworkCore.DbContext..ctor(DbContextOptions options)
at MyFunc.ReadOnlyMainDataDBContext..ctor(DbContextOptions`1 options) in D:\\Work\\MyFunc\\DBContext.cs:line 72
at lambda_method(Closure )
at DryIoc.Scope.TryGetOrAdd(ImMap`1 items, Int32 id, CreateScopedValue createValue, Int32 disposalOrder) in D:\\a\\_work\\1\\s\\src\\WebJobs.Script.WebHost\\DependencyInjection\\DryIoc\\Container.cs:line 7849
at DryIoc.Scope.GetOrAdd(Int32 id, CreateScopedValue createValue, Int32 disposalOrder) in D:\\a\\_work\\1\\s\\src\\WebJobs.Script.WebHost\\DependencyInjection\\DryIoc\\Container.cs:line 7834
at lambda_method(Closure )
at DryIoc.Scope.TryGetOrAdd(ImMap`1 items, Int32 id, CreateScopedValue createValue, Int32 disposalOrder) in D:\\a\\_work\\1\\s\\src\\WebJobs.Script.WebHost\\DependencyInjection\\DryIoc\\Container.cs:line 7849
at DryIoc.Scope.GetOrAdd(Int32 id, CreateScopedValue createValue, Int32 disposalOrder) in D:\\a\\_work\\1\\s\\src\\WebJobs.Script.WebHost\\DependencyInjection\\DryIoc\\Container.cs:line 7834
at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, Object serviceKey, IfUnresolved ifUnresolved, Type requiredServiceType, Request preResolveParent, Object[] args) in D:\\a\\_work\\1\\s\\src\\WebJobs.Script.WebHost\\DependencyInjection\\DryIoc\\Container.cs:line 309
at DryIoc.Container.ResolveAndCacheDefaultFactoryDelegate(Type serviceType, IfUnresolved ifUnresolved) in D:\\a\\_work\\1\\s\\src\\WebJobs.Script.WebHost\\DependencyInjection\\DryIoc\\Container.cs:line 225
at DryIoc.Container.DryIoc.IResolver.Resolve(Type serviceType, IfUnresolved ifUnresolved) in D:\\a\\_work\\1\\s\\src\\WebJobs.Script.WebHost\\DependencyInjection\\DryIoc\\Container.cs:line 196
at Microsoft.Azure.WebJobs.Script.WebHost.DependencyInjection.ScopedServiceProvider.GetService(Type serviceType) in D:\\a\\_work\\1\\s\\src\\WebJobs.Script.WebHost\\DependencyInjection\\ScopedServiceProvider.cs:line 25
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
at MassTransit.ExtensionsDependencyInjectionIntegration.Registration.DependencyInjectionScopeServiceProvider.GetService[T]()
at MassTransit.ExtensionsDependencyInjectionIntegration.ScopeProviders.DependencyInjectionConsumerScopeProvider.GetScope[TConsumer,T](ConsumeContext`1 context)
at MassTransit.Scoping.ScopeConsumerFactory`1.Send[TMessage](ConsumeContext`1 context, IPipe`1 next)
at MassTransit.Pipeline.Filters.ConsumerMessageFilter`2.GreenPipes.IFilter<MassTransit.ConsumeContext<TMessage>>.Send(ConsumeContext`1 context, IPipe`1 next)
at MassTransit.Pipeline.Filters.ConsumerMessageFilter`2.GreenPipes.IFilter<MassTransit.ConsumeContext<TMessage>>.Send(ConsumeContext`1 context, IPipe`1 next)
at GreenPipes.Filters.TeeFilter`1.<>c__DisplayClass5_0.<<Send>g__SendAsync|1>d.MoveNext()

项目安装的NuGet包版本

<PackageReference Include="AutoMapper" Version="10.1.1" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Dapper" Version="2.0.35" />
<PackageReference Include="Dapper.Contrib" Version="2.0.35" />
<PackageReference Include="MassTransit.Azure.ServiceBus.Core" Version="7.3.1" />
<PackageReference Include="MassTransit.Extensions.DependencyInjection" Version="7.3.1" />
<PackageReference Include="MassTransit.WebJobs.ServiceBus" Version="7.3.1" />
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.3.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Script.ExtensionsMetadataGenerator" Version="1.1.3" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.8" />
<PackageReference Include="System.Data.SqlClient" Version="4.6.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.33" />
<PackageReference Include="Microsoft.Azure.Storage.Blob" Version="11.2.3" />
<PackageReference Include="Microsoft.Azure.Storage.Queue" Version="11.2.3" />
<PackageReference Include="Microsoft.Azure.Storage.Common" Version="11.2.3" />
<PackageReference Include="Microsoft.Azure.Cosmos.Table" Version="1.0.8" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Storage" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.5" />
<PackageReference Include="Microsoft.Azure.EventHubs" Version="4.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.DurableTask" Version="2.4.0" />
解决方案

问题根因是程序集版本不匹配:项目使用的EF Core 3.1.5版本依赖3.1.x系列的Microsoft.Extensions.DependencyInjection抽象,手动安装6.0.0版本的DI包后,MassTransit在创建消费作用域解析DbContext时,EF Core内部初始化服务提供器无法找到对应版本的类型,触发类型加载异常。
经测试验证,将Microsoft.Extensions.DependencyInjection NuGet包降级至3.1.5版本即可解决该问题,降级后DbContext可在MassTransit消费者中正常解析使用,其余服务注入不受影响。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:51:21