У меня есть многопроектное серверное решение на базе .NET 8. Он использует действия GitHub для создания проекта сборки/публикации с выпуском, который позже используется AWS Lambda для его запуска при каждом вызове.
Конвейер CI/CD запускает эту команду для сборки проекта с конфигурацией выпуска:
В некоторых проектах в рамках этого решения .NET мне требуется SqlClient, поэтому я использую пакет System.Data.SqlClient версии 4.8.6. Поскольку на этот проект ссылается проект API (мой стартовый проект), у меня есть пакет SqlClient, упомянутый в его файле .csproj, например:
Запуск серверной службы на любом локальном компьютере работает нормально, но после успешных сборок GitHub Actions в некоторых сборках лямбда не может запустить созданный образ, тогда как в остальных сборках лямбда успешно запускает образ.
Я поделился журналом CloudWatch ниже, когда лямбда пытается запустить выпускные сборки, имеющие проблемы, и не запускается ни для одного из вызовов лямбда:
/>
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types.
Could not load file or assembly 'System.Data.SqlClient, Version=4.6.1.6, Culture=neutral, PublicKeyToken=b03xxxxx11xxxxxx'. The system cannot find the file specified.
at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
at MediatR.Registration.ServiceRegistrar.c.b__1_0(Assembly a)
at System.Linq.Enumerable.SelectManySingleSelectorIterator`2.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
at MediatR.Registration.ServiceRegistrar.ConnectImplementationsToTypesClosing(Type openRequestInterface, IServiceCollection services, IEnumerable`1 assembliesToScan, Boolean addIfAlreadyExists, MediatRServiceConfiguration configuration)
at MediatR.Registration.ServiceRegistrar.AddMediatRClasses(IServiceCollection services, IEnumerable`1 assembliesToScan, MediatRServiceConfiguration configuration)
at MediatR.ServiceCollectionExtensions.AddMediatR(IServiceCollection services, IEnumerable`1 assemblies, Action`1 configuration)
at MediatR.ServiceCollectionExtensions.AddMediatR(IServiceCollection services, Assembly[] assemblies)
at platform_jjz_service_api.Startup.ConfigureServices(IServiceCollection services) in /runner/_work/JJZClin/JJZClin/platform_jjz_service_api/Startup.cs:line 292
at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)
at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(Object instance, IServiceCollection services)
at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services, Object instance)
at Microsoft.Extensions.Hosting.HostBuilder.InitializeServiceProvider()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction`2.Start()
at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction`2..ctor(StartupMode startupMode)
at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction`2..ctor()
at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction..ctor()
at platform_jjz_service_api.LambdaEntryPoint..ctor()
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)
Расследование, которое я провел:
Выполнил действия github несколько раз в одной и той же ветке git без изменений кода, в некоторых сборках лямбда-выражение выполнялось успешно, тогда как в некоторых сборках не удалось запустить образ.
Загрузил артефакт, который собирают действия GitHub (который выдает ошибку, когда лямбда-выражение пытается его запустить), и запустил его локально с помощью dotnet Platform_jjz_service_api.dll, и на моем локальном компьютере возникла такая же ошибка.
Проверено наличие файла «System.Data.SqlClient.dll» в разархивированной папке артефакта.
Проверена версия сборки «System.Data.SqlClient.dll», используя [System.Reflection.AssemblyName]::GetAssemblyName("System.Data.SqlClient.dll").Version, и он вернул 4.6.1.6
Что меня беспокоит в этой периодической ошибке:
Почему эта ошибка возникает только в прерывистых образах сборки?
В соответствии с 4-м пунктом моего раздела «Расследования» выше, в образах сборок, которые выдают ошибку, несмотря на то, что в этой сборке находится сборка System.Data.SqlClient с версией 4.6.1.6, почему лямбда-выражение AWS выдает эту ошибку?
У меня есть многопроектное серверное решение на базе .NET 8. Он использует действия GitHub для создания проекта сборки/публикации с выпуском, который позже используется AWS Lambda для его запуска при каждом вызове. Конвейер CI/CD запускает эту команду для сборки проекта с конфигурацией выпуска: [code]dotnet publish -c Release -r linux-x64 --self-contained false -o ./publish [/code] В некоторых проектах в рамках этого решения .NET мне требуется SqlClient, поэтому я использую пакет System.Data.SqlClient версии 4.8.6. Поскольку на этот проект ссылается проект API (мой стартовый проект), у меня есть пакет SqlClient, упомянутый в его файле .csproj, например: [code] [/code] Запуск серверной службы на любом локальном компьютере работает нормально, но после успешных сборок GitHub Actions в некоторых сборках лямбда не может запустить созданный образ, тогда как в остальных сборках лямбда успешно запускает образ. Я поделился журналом CloudWatch ниже, когда лямбда пытается запустить выпускные сборки, имеющие проблемы, и не запускается ни для одного из вызовов лямбда: />[code]System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Could not load file or assembly 'System.Data.SqlClient, Version=4.6.1.6, Culture=neutral, PublicKeyToken=b03xxxxx11xxxxxx'. The system cannot find the file specified. at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module) at MediatR.Registration.ServiceRegistrar.c.b__1_0(Assembly a) at System.Linq.Enumerable.SelectManySingleSelectorIterator`2.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() at MediatR.Registration.ServiceRegistrar.ConnectImplementationsToTypesClosing(Type openRequestInterface, IServiceCollection services, IEnumerable`1 assembliesToScan, Boolean addIfAlreadyExists, MediatRServiceConfiguration configuration) at MediatR.Registration.ServiceRegistrar.AddMediatRClasses(IServiceCollection services, IEnumerable`1 assembliesToScan, MediatRServiceConfiguration configuration) at MediatR.ServiceCollectionExtensions.AddMediatR(IServiceCollection services, IEnumerable`1 assemblies, Action`1 configuration) at MediatR.ServiceCollectionExtensions.AddMediatR(IServiceCollection services, Assembly[] assemblies) at platform_jjz_service_api.Startup.ConfigureServices(IServiceCollection services) in /runner/_work/JJZClin/JJZClin/platform_jjz_service_api/Startup.cs:line 292 at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr) at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at Microsoft.AspNetCore.Hosting.ConfigureServicesBuilder.InvokeCore(Object instance, IServiceCollection services) at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services, Object instance) at Microsoft.Extensions.Hosting.HostBuilder.InitializeServiceProvider() at Microsoft.Extensions.Hosting.HostBuilder.Build() at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction`2.Start() at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction`2..ctor(StartupMode startupMode) at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction`2..ctor() at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction..ctor() at platform_jjz_service_api.LambdaEntryPoint..ctor() at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions) [/code] Расследование, которое я провел: [list] [*]Выполнил действия github несколько раз в одной и той же ветке git без изменений кода, в некоторых сборках лямбда-выражение выполнялось успешно, тогда как в некоторых сборках не удалось запустить образ. [*]Загрузил артефакт, который собирают действия GitHub (который выдает ошибку, когда лямбда-выражение пытается его запустить), и запустил его локально с помощью dotnet Platform_jjz_service_api.dll, и на моем локальном компьютере возникла такая же ошибка. [*]Проверено наличие файла «System.Data.SqlClient.dll» в разархивированной папке артефакта. [*]Проверена версия сборки «System.Data.SqlClient.dll», используя [System.Reflection.AssemblyName]::GetAssemblyName("System.Data.SqlClient.dll").Version, и он вернул 4.6.1.6 [/list] Что меня беспокоит в этой периодической ошибке: [list] [*]Почему эта ошибка возникает только в прерывистых образах сборки? [*]В соответствии с [b]4-м пунктом[/b] моего раздела «Расследования» выше, в образах сборок, которые выдают ошибку, несмотря на то, что в этой сборке находится сборка System.Data.SqlClient с версией 4.6.1.6, почему лямбда-выражение AWS выдает эту ошибку? [/list]