2017-01-22 8 views
4

私はRDSのMySql経由でデータにアクセスするラムダマイクロサービスを構築しています。私の地元のユニットテストはうまく動作しますが、私はAWSに公開するときに、私は次のエラーを取得する:ここでAWS Lambda、.Net Core、&MySql:ファイルまたはアセンブリのSystem.Diagnostics.TraceSourceを読み込めませんでした。バージョン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

これで解決しましたか?私はmysqlのためにsapientguardian nugetパッケージでef coreを使用していますが、同じことをやっています。 –

+1

同様の問題を解決しました。私がしなければならなかったのは 'dotnet publish'でしたし、\ publish \ runtimes \ unix \ lib \ netstandard1.3サブフォルダからdllをパブリッシュフォルダにコピーしてください。公開フォルダ(ランタイムフォルダは含まれていません)の内容を圧縮し、ラムダにアップロードします。あなたが@xonと@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に依存します。System.Diagnostics.TraceSourceはパブリッシュされたフォルダで終わらず、ラムダで実行されたときにそれを見つけることができません。これは私のために働いた。ありがとうございましたJon –

+0

ありがとう、この回避策です。恒久的な解決策に関するアイデアはありますか?私の目標は、C#+ Lambda + MySQLの開発プロセスを構築することです。 – xeon

+0

@xeonあなたと私の両方。残念ながら、私のAWS VSツールキットは正しく動作しません(フェデレーションユーザーのトラブル、sigh)。 @dohmooseと@alduarの回答を試して、ファイルを 'dotnet publish'の一部としてコピーすることができます。これらの答えの前提は、あなたがWindowsに公開しているということです。他のプラットフォームでも同様の方法でコピーすることができます。 –

0

最も簡単な解決策は、project.jsonファイルを編集することです。 はprepublishイベントに

"スクリプト" を追加するには:{ "prepublish":[「xcopyの./bin/Release/netcoreapp1.0/publish/runtimes/unix/libnetstandard1.3/System.Diagnostics.TraceSource.dll これにより、参照がコピーされます。 AWS公開ウィザードでコピーされます。

@alduarと同様によろしく

アルド・フローレス

0

が、私はDLLが最初のビルドには存在しないので、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

これは、すべての正しいファイルが含まれている公開フォルダを作成します。

関連する問題