Un'aggiunta alla risposta che @AndreiU ha già dato e come riprodurre localmente gli errori di runtime.
Ho ricevuto l'errore di runtime di seguito durante la distribuzione in Azure, non localmente.
Impossibile caricare il file o l'assembly "System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a" o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" in Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n in Company.Project .BackOffice.Web.Controllers.OrderController..ctor () in C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: riga 30 \ r \ n su lambda_method ( Closure) \ r \ n in System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (richiesta HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" in Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n in Company.Project .BackOffice.Web.Controllers.OrderController..ctor () in C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: riga 30 \ r \ n su lambda_method ( Closure) \ r \ n in System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (richiesta HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" in Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n in Company.Project .BackOffice.Web.Controllers.OrderController..ctor () in C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: riga 30 \ r \ n su lambda_method ( Closure) \ r \ n in System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (richiesta HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}}
Quando ho iniziato a guardare gli assembly, ho notato che il mio progetto Web e il progetto di servizio erano destinati a versioni diverse System.Net.Http
.
Progetto web:
Progetto di servizio:
È facile pensare che ciò sia causato da una mancata corrispondenza nelle versioni, ma la chiave qui è guardare l'errore The system cannot find the file specified.
.
Osservando la proprietà path possiamo vedere che il progetto web è destinato a un assembly .Net Framework mentre il servizio è destinato a un assembly da Visual Studio 2017. Poiché sul server non è installato Visual Studio 2017, si verificherà l'errore di runtime.
Percorso web:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll
Percorso di servizio:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
Qualcosa di semplice come impostazione Copy Local
per true
poter risolvere il problema, ma non in tutti i casi.
Per riprodurre l'errore sulla tua macchina locale, rimuovi semplicemente il file System.Net.Http.dll
dalla cartella specifica di Visual Studio. Questo ti darà l'errore di runtime e probabilmente alcuni errori di compilazione. Dopo che questi sono stati riparati, tutto dovrebbe funzionare, almeno per me.
Se hai installato System.Net.Http
tramite NuGet
verifica quale assembly viene utilizzato guardando la .csproj
versione. System.Net.Http 4.3.4
fornisce il seguente assembly per esempio:
<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>
Se utilizzi un server di compilazione come Jenkins, TeamCity o AppVey o il runtime mancante .dll
potrebbe esistere anche lì. In questo caso potrebbe non essere utile usare la versione NuGet di System.Net.Http o eliminare .dll
localmente il file mancante . Per risolvere questo errore guarda la versione che non è stata trovata e lo specifico PublicKeyToken
. Successivamente crea un reindirizzamento vincolante in uno Web.config
o in App.config
base al tuo progetto. Nel mio caso vorrei invece utilizzare 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>
Un buon thread Github sul problema:
https://github.com/dotnet/corefx/issues/22781