Aws-lambda-dotnet: Visual Studio2017での展開が失敗する

作成日 2017年04月03日  ·  10コメント  ·  ソース: aws/aws-lambda-dotnet

VS 2015プロジェクトを取得し、コンパイルしてVS2017でLambdaにデプロイしました。

結果は次のとおりです。

at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
Exception has been thrown by the target of an invocation.: TargetInvocationException
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.AspNetCore.Hosting.Internal.ConfigureServicesBuilder.Invoke(Object instance, IServiceCollection exportServices)
at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction..ctor()
The given key was not present in the dictionary.: KeyNotFoundException
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.ComputeClassification(String dependency)
at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.ComputeClassification(String dependency)
at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.ComputeClassification(String dependency)
at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.ComputeClassification(String dependency)
at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.<GetCandidates>d__4.MoveNext()
at System.Linq.Enumerable.<SelectManyIterator>d__157`2.MoveNext()
at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
at Microsoft.Extensions.DependencyInjection.MvcCoreServiceCollectionExtensions.GetApplicationPartManager(IServiceCollection services)
at Microsoft.Extensions.DependencyInjection.MvcCoreServiceCollectionExtensions.AddMvcCore(IServiceCollection services)
at Microsoft.Extensions.DependencyInjection.MvcServiceCollectionExtensions.AddMvc(IServiceCollection services)
guidance

最も参考になるコメント

私の解決策:csprojファイルを開き、PreserveCompilationContextをfalseに設定します。
<PreserveCompilationContext>false</PreserveCompilationContext>

詳細な説明:
VS 2017プロジェクトは、PreserveCompilationContextをtrueに設定します。 これは、公開/展開するときに、VSがルート公開フォルダーと同じアセンブリを多数含む「ref」フォルダーを発行することを意味します。 何かがすべてのアセンブリを再帰的にスキャンしてそれを台無しにしているのではないかと思いますが、まったくわかりません。 これまでに知っているのは、その設定を変更して機能するようになったことだけです。これを共有して、他の人に役立つかどうかを確認したいと思いました。

全てのコメント10件

こんにちは@genifycom 、あなたのプロジェクトのcsprojファイルを共有できますか?

VS2017からデプロイすると、AddMvc()から同じエラーが発生します。

プロジェクトにcsprojファイルを提供できますか?

共有できるリプロを作成できるかもしれませんが、共有方法を優先しますか?

再現可能なコードが含まれているGitHubリポジトリが適しています。 そこにある余分なコードが少ないほど、問題を特定しやすくなります。

Macでヨーマンを使って生成しました。 次に、 dotnet migrateを使用してプロジェクトをcsprojに変換しました。 公開して呼び出すと、次の例外が発生します。

{
  "errorType": "LambdaException",
  "errorMessage": "An exception was thrown when the constructor for type 'PreviewAspNetCoreWebAPI.LambdaEntryPoint' was invoked. Check inner exception for more details.",
  "cause": {
    "errorType": "TargetInvocationException",
    "errorMessage": "Exception has been thrown by the target of an invocation.",
    "stackTrace": [
      "at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)",
      "at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)",
      "at System.Activator.CreateInstance(Type type, Boolean nonPublic)",
      "at System.Activator.CreateInstance(Type type)"
    ],
    "cause": {
      "errorType": "TargetInvocationException",
      "errorMessage": "Exception has been thrown by the target of an invocation.",
      "stackTrace": [
        "at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)",
        "at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)",
        "at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)",
        "at Microsoft.AspNetCore.Hosting.Internal.ConfigureServicesBuilder.Invoke(Object instance, IServiceCollection exportServices)",
        "at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()",
        "at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()",
        "at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()",
        "at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction..ctor()"
      ],
      "cause": {
        "errorType": "KeyNotFoundException",
        "errorMessage": "The given key was not present in the dictionary.",
        "stackTrace": [
          "at System.Collections.Generic.Dictionary`2.get_Item(TKey key)",
          "at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.ComputeClassification(String dependency)",
          "at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.ComputeClassification(String dependency)",
          "at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.ComputeClassification(String dependency)",
          "at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.ComputeClassification(String dependency)",
          "at Microsoft.AspNetCore.Mvc.Internal.DefaultAssemblyPartDiscoveryProvider.CandidateResolver.<GetCandidates>d__4.MoveNext()",
          "at System.Linq.Enumerable.<SelectManyIterator>d__157`2.MoveNext()",
          "at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()",
          "at Microsoft.Extensions.DependencyInjection.MvcCoreServiceCollectionExtensions.GetApplicationPartManager(IServiceCollection services)",
          "at Microsoft.Extensions.DependencyInjection.MvcCoreServiceCollectionExtensions.AddMvcCore(IServiceCollection services)",
          "at Microsoft.Extensions.DependencyInjection.MvcServiceCollectionExtensions.AddMvc(IServiceCollection services)",
          "at PreviewAspNetCoreWebAPI.Startup.ConfigureServices(IServiceCollection services) in /PreviewAspNetCoreWebAPI/src/PreviewAspNetCoreWebAPI/Startup.cs:line 34"
        ]
      }
    }
  }
}

@KraigMを複製していただきありがとうございます

これは現在私にとってブロッキングの問題です。

私の解決策:csprojファイルを開き、PreserveCompilationContextをfalseに設定します。
<PreserveCompilationContext>false</PreserveCompilationContext>

詳細な説明:
VS 2017プロジェクトは、PreserveCompilationContextをtrueに設定します。 これは、公開/展開するときに、VSがルート公開フォルダーと同じアセンブリを多数含む「ref」フォルダーを発行することを意味します。 何かがすべてのアセンブリを再帰的にスキャンしてそれを台無しにしているのではないかと思いますが、まったくわかりません。 これまでに知っているのは、その設定を変更して機能するようになったことだけです。これを共有して、他の人に役立つかどうかを確認したいと思いました。

@DohMooseも私をブロック解除しました。 これは、プロジェクトファイルにコンパイルコンテキストfalseを追加しないdotnetコア移行の問題である可能性が高いと思われますか?

@DohMoose素晴らしい、それは私にとっても問題を解決しました。 ありがとうございました。

コンテキストとして、VS2015展開からVS2017に切り替えたところ、起動時にそのエラーが発生していました。

このページは役に立ちましたか?
0 / 5 - 0 評価