@AndreiUによる回答と、ローカルで実行時エラーを再現する方法への追加。
ローカルではなくAzureにデプロイすると、以下のランタイムエラーが発生しました。
ファイルまたはアセンブリ 'System.Net.Http、Version = 4.2.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a'またはその依存関係の1つを読み込めませんでした。指定されたファイルが見つかりません。 "、" ExceptionType ":" System.IO.FileNotFoundException "、" StackTrace ":" at Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\ r \ n Company.Project .BackOffice.Web.Controllers.OrderController..ctor()in C:\ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs:line 30 \ r \ n at lambda_method(クロージャ)\ r \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request、HttpControllerDescriptor controllerDescriptor、Type controllerType) "}}で Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a 'またはその依存関係の1つ。指定されたファイルが見つかりません。 "、" ExceptionType ":" System.IO.FileNotFoundException "、" StackTrace ":" at Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\ r \ n at Company.Project .BackOffice.Web.Controllers.OrderController..ctor()in C:\ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs:line 30 \ r \ n at lambda_method(クロージャ)\ r \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request、HttpControllerDescriptor controllerDescriptor、Type controllerType) "}}で Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a 'またはその依存関係の1つ。指定されたファイルが見つかりません。 "、" ExceptionType ":" System.IO.FileNotFoundException "、" StackTrace ":" at Company.Project.Service.CompanyIntegrationApiService..ctor(Uri baseAddress)\ r \ n at Company.Project .BackOffice.Web.Controllers.OrderController..ctor()in C:\ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs:line 30 \ r \ n at lambda_method(クロージャ)\ r \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request、HttpControllerDescriptor controllerDescriptor、Type controllerType) "}}で
アセンブリを検討し始めたとき、私のWebプロジェクトとサービスプロジェクトがの異なるバージョンをターゲットにしていることがわかりましたSystem.Net.Http
。
Webプロジェクト:
奉仕プロジェクト:
これはバージョンの不一致が原因であると考えるのは簡単ですが、ここで重要なのはエラーを確認することThe system cannot find the file specified.
です。
パスプロパティを見ると、Webプロジェクトが.Net Frameworkアセンブリをターゲットにしているのに対し、サービスはVisual Studio 2017のアセンブリをターゲットにしていることがわかります。サーバーにVisual Studio 2017がインストールされていないため、ランタイムエラーが発生します。
Webパス:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll
サービスパス:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
設定Copy Local
するtrue
だけの簡単な方法で問題を解決できますが、すべての場合ではありません。
ローカルマシンでエラーを再現するにSystem.Net.Http.dll
は、Visual Studio固有のフォルダーから必要なものを削除するだけです。これにより、ランタイムエラーが発生し、おそらくいくつかのビルドエラーが発生します。これらが修正された後、すべてが機能するはずですが、少なくとも私にとってはうまくいきました。
バージョンを見て、どのアセンブリが使用されているかSystem.Net.Http
をNuGet
確認してインストールした場合.csproj
。System.Net.Http 4.3.4
たとえば、次のアセンブリを提供します。
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
Jenkins、TeamCity、AppVeyorなどのビルドサーバーを使用している場合は、ランタイムが不足している.dll
可能性もあります。この場合、NuGetバージョンのSystem.Net.Httpを使用したり、不足しているものを.dll
ローカルで削除したりしても役に立たない場合があります。このエラーを解決するには、見つからないバージョンと特定のバージョンを確認しますPublicKeyToken
。その後、いずれWeb.config
かで、またはApp.config
プロジェクトに応じて、バインディングリダイレクトを作成します。私の場合、代わりに4.0.0.0を使用したいと思います。
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
この問題についての良いGithubスレッド:
https://github.com/dotnet/corefx/issues/22781