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
相关产品推荐
相关产品推荐

