Dodatek do odpowiedzi już podanej przez @AndreiU i jak lokalnie odtwarzać błędy uruchomieniowe.
Podczas wdrażania na platformie Azure, a nie lokalnie, wystąpił poniżej błąd środowiska wykonawczego.
Nie można załadować pliku lub zestawu „System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a” lub jednej z jego zależności. System nie może znaleźć określonego pliku. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" w Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n at Company.Project .BackOffice.Web.Controllers.OrderController..ctor () w C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: line 30 \ r \ n at lambda_method ( Closure) \ r \ n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (żądanie HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'lub jedna z jego zależności. System nie może znaleźć określonego pliku. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" w Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n at Company.Project .BackOffice.Web.Controllers.OrderController..ctor () w C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: line 30 \ r \ n at lambda_method ( Closure) \ r \ n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (żądanie HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'lub jedna z jego zależności. System nie może znaleźć określonego pliku. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" w Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n at Company.Project .BackOffice.Web.Controllers.OrderController..ctor () w C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: line 30 \ r \ n at lambda_method ( Closure) \ r \ n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (żądanie HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}}
Kiedy zacząłem przeglądać zestawy, zauważyłem, że mój projekt sieci Web i projekt usługi były przeznaczone dla różnych wersji System.Net.Http
.
Projekt internetowy:
Projekt serwisowy:
Łatwo jest pomyśleć, że jest to spowodowane niedopasowaniem wersji, ale kluczowe jest tutaj przyjrzenie się błędowi The system cannot find the file specified.
.
Patrząc na właściwość path, widzimy, że projekt sieci Web jest przeznaczony dla zestawu .Net Framework, podczas gdy usługa jest przeznaczona dla zestawu z programu Visual Studio 2017. Ponieważ na serwerze nie jest zainstalowany program Visual Studio 2017, wystąpi błąd w czasie wykonywania.
Ścieżka internetowa:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll
Ścieżka serwisowa:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
Coś tak prostego jak ustawienie Copy Local
, aby true
można rozwiązać ten problem, jednak nie we wszystkich przypadkach.
Aby odtworzyć błąd na komputerze lokalnym, po prostu usuń potrzebne pliki System.Net.Http.dll
z folderu określonego programu Visual Studio. Spowoduje to błąd w czasie wykonywania i prawdopodobnie błędy kompilacji. Po ich naprawieniu wszystko powinno działać, przynajmniej mi się udało.
Jeśli zainstalowałeś System.Net.Http
za pomocą, NuGet
sprawdź, który zestaw jest używany, patrząc na .csproj
wersję. System.Net.Http 4.3.4
podaje na przykład następujący montaż:
<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>
Jeśli używasz serwera kompilacji, takiego jak Jenkins, TeamCity lub AppVeyor, .dll
może tam również brakować środowiska wykonawczego . W takim przypadku może nie pomóc użycie wersji NuGet System.Net.Http lub usunięcie brakującego .dll
lokalnego. Aby rozwiązać ten błąd, spójrz na wersję, która nie została znaleziona, i na konkretną wersję PublicKeyToken
. Następnie utwórz przekierowanie wiążące w jednym Web.config
lub w App.config
zależności od projektu. W moim przypadku zamiast tego chciałbym użyć 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>
Dobry wątek na Githubie dotyczący problemu:
https://github.com/dotnet/corefx/issues/22781