2017-01-22 6 views
4

Я создаю лямбда-микросервисы, которые получают доступ к данным через MySql в RDS. Мои местные модульные тесты работают нормально, но когда я публикую на AWS, я получаю следующее сообщение об ошибке:AWS Lambda, .Net Core и MySql: не удалось загрузить файл или сборку. System.Diagnostics.TraceSource, Version = 4.0.0.0

{ 
    "TypeName": "MySql.Data.MySqlClient.MySqlTrace", 
    "Message": "The type initializer for 'MySql.Data.MySqlClient.MySqlTrace' threw an exception.", 
    "Data": {}, 
    "InnerException": { 
    "Message": "Could not load file or assembly 'System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.\n", 
    "FileName": "System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", 
    "Data": {}, 
    "InnerException": { 
     "Message": "'System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' not found in the deployment package or in the installed Microsoft.NETCore.App.", 
     "FileName": null, 
     "Data": {}, 
     "InnerException": null, 
     "StackTrace": " at AWSLambda.Internal.Bootstrap.LambdaAssemblyLoadContext.Load(AssemblyName assemblyName)\n at System.Runtime.Loader.AssemblyLoadContext.ResolveUsingLoad(AssemblyName assemblyName)\n at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)", 
     "HelpLink": null, 
     "Source": "Bootstrap", 
     "HResult": -2147024894 
    }, 
    "StackTrace": null, 
    "HelpLink": null, 
    "Source": null, 
    "HResult": -2147024894 
    }, 
    "StackTrace": " at MySql.Data.MySqlClient.MySqlTrace.LogError(Int32 id, String msg)\n at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()\n at MySql.Data.MySqlClient.MySqlPool.GetConnection()\n at MySql.Data.MySqlClient.MySqlConnection.Open()\n at HealthStats.Functions.GetLocationTypes(APIGatewayProxyRequest request, ILambdaContext context)", 
    "HelpLink": null, 
    "Source": "MySql.Data", 
    "HResult": -2146233036 
} 

Вот мой файл project.json. Я попытался добавить библиотеку System.Diagnostics.TraceSource в качестве стандартной зависимости проекта (не показан) и как зависимость от структуры (показано ниже). Мое мышление было, возможно, во время публикации, что он не добавлял сборку, потому что я не использовал напрямую TraceSource в своем коде. Однако ни одна попытка не разрешила проблему:

{ 
    "version": "1.0.0-*", 
    "buildOptions": { 
    "emitEntryPoint": false 
    }, 

    "dependencies": { 
    "Amazon.Lambda.APIGatewayEvents": "1.0.1", 
    "Amazon.Lambda.Core": "1.0.0", 
    "Amazon.Lambda.Serialization.Json": "1.0.1", 
    "Amazon.Lambda.Tools": { 
     "type": "build", 
     "version": "1.1.0-preview1" 
    }, 
    "Microsoft.NETCore.App": { 
     "type": "platform", 
     "version": "1.0.0" 
    }, 
    "MySql.Data": "7.0.6-IR31" 
    }, 

    "tools": { 
    "Amazon.Lambda.Tools" : "1.1.0-preview1" 
    }, 

    "frameworks": { 
    "netcoreapp1.0": { 
     "dependencies": { 
     "System.Diagnostics.TraceSource": "4.0.0" 
     }, 
     "imports": [ 
     "dnxcore50", 
     "portable-net45+win8" 
     ] 
    } 
    } 
} 

Любые идеи?

+0

Вы нашли ответ на этот вопрос? Я делаю то же самое, за исключением того, что я использую ef core с пакетом sapientguardian nuget для mysql. –

+1

Просто выдумал решение аналогичной проблемы. То, что мне нужно было сделать, это «dotnet publish», а затем скопировать dll из папки \ publish \ runtimes \ unix \ lib \ netstandard1.3 в папку публикации. Заблокируйте содержимое папки публикации (папка времени выполнения не входит) и загрузите ее в лямбда. Дайте мне знать, если это сработает для вас @xeon и @SnOrfus –

+0

@JonPeterson Если вы хотите опубликовать это в качестве ответа, я бы проголосовал за него. Это сработало для меня. Я попытался скопировать сборку в папку публикации, а затем использовать публикацию из визуальной студии (думая, что она возьмет скопированную сборку), которая не сработала. Так что я был на правильном пути. Спасибо за совет! –

ответ

4

Я видел подобную проблему в результатах лямбды:

The type initializer for 'MySql.Data.MySqlClient.MySqlTrace' threw an exception.: TypeInitializationException at MySql.Data.MySqlClient.MySqlTrace.LogError(Int32 id, String msg) at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() at MySql.Data.MySqlClient.MySqlPool.GetConnection() at MySql.Data.MySqlClient.MySqlConnection.Open() at AWSLambda2.Function.FunctionHandler(SNSEvent input, ILambdaContext context) at lambda_method(Closure , Stream , Stream , ContextInfo)

'System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' not found in the deployment package or in the installed Microsoft.NETCore.App.: FileNotFoundException at AWSLambda.Internal.Bootstrap.LambdaAssemblyLoadContext.Load(AssemblyName assemblyName) at System.Runtime.Loader.AssemblyLoadContext.ResolveUsingLoad(AssemblyName assemblyName) at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)

работало для меня было вручную публиковать проект с помощью dotnet publish, а затем в этой опубликованной папке ходовой для .\publish\runtimes\unix\lib\netstandard1.3 и копирование библиотеки DLL, которые были опубликованы там в .\publish. Как только они были в этой папке, я закрепил содержимое папки публикации, исключая подпапку времени выполнения, и загрузил ее в лямбда.

Моя рабочая теория, почему это происходит потому, что dotnet publish издает, как если интеллектуальная система использует результаты, однако я думаю, что лямбда загружает сборку в другой контекст, который не знает о поиске в суб- папки для зависимостей.

+1

+1 SapientGuardian.EntityFrameworkCore.MySql принимает зависимость от System.Diagnostics.TraceSource, который не попадает в опубликованную папку и не находит его, когда он работает в лямбда. Это сработало для меня. Еще раз спасибо Jon –

+0

Благодарим вас за этот обходной путь. Любые идеи о постоянном решении? Моя цель - создать процесс разработки для C# + Lambda + MySQL. – xeon

+0

@xeon вы и я оба. К сожалению, для меня мой AWS VS toolkit работает неправильно (проблемы с федеративными пользователями, вздох). Вы можете попробовать ответы от @dohmoose и @alduar, чтобы скопировать файлы как часть публикации «dotnet publish». Обратите внимание, что предположение для этих ответов заключается в том, что вы публикуете в Windows - я уверен, что есть эквивалентный способ копирования на других платформах. –

0

Самое простое решение - отредактировать файл project.json. Для добавления prepublish события

"сценарии": { "prepublish": [ «хсор ./bin/Release/netcoreapp1.0/publish/runtimes/unix/libnetstandard1.3/System.Diagnostics.TraceSource.dll ./bin/Release/ "], " postpublish ": [" dotnet publish-iis --publish-folder% publish: OutputPath% --framework% publish: FullTargetFramework% "] } Это приводит к копированию ссылки прежде чем Мастер публикации AWS скопирует его.

С уважением

Aldo Flores

0

Подобно @alduar, но я думаю, что это более целесообразно, чтобы положить его в postpublish, так как длл не будет там на первой сборки. И я думаю, что он должен быть скопирован в каталог публикации. Обратите внимание: эти пути к файлам предназначены для окон.

"scripts": { 
     "postpublish": [ "xcopy bin\\Release\\netcoreapp1.0\\publish\\runtimes\\unix\\lib\\netstandard1.3\\System.Diagnostics.TraceSource.dll bin\\Release\\netcoreapp1.0\\publish\\" ] 
    }, 
0

У меня была такая же проблема после запуска следующей команды.

dotnet publish src\Lambda.csproj -c Release

Сначала я установил ее путем копирования файлов из runtimes\unix\lib\netstandard1.3 как Джон Петерсон предложил.

Я нашел решение, которое кажется чистым, хотя. Теперь я просто запускаю следующее.

dotnet publish src\Lambda.csproj -c Release -r linux

Это создаст опубликовать папку, которая содержит все нужные файлы.

Смежные вопросы