Un ajout à la réponse déjà donnée par @AndreiU et comment reproduire les erreurs d'exécution localement
J'ai eu l'erreur d'exécution ci-dessous lors du déploiement sur Azure, pas localement.
Impossible de charger le fichier ou l'assembly 'System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" à Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n à Company.Project .BackOffice.Web.Controllers.OrderController..ctor () dans C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: ligne 30 \ r \ n à lambda_method ( Closure) \ r \ n à System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (requête HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, tapez controllerType) "}} Culture = neutre, PublicKeyToken = b03f5f7f11d50a3a 'ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" à Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n à Company.Project .BackOffice.Web.Controllers.OrderController..ctor () dans C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: ligne 30 \ r \ n à lambda_method ( Closure) \ r \ n à System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (requête HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, tapez controllerType) "}} Culture = neutre, PublicKeyToken = b03f5f7f11d50a3a 'ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" à Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n à Company.Project .BackOffice.Web.Controllers.OrderController..ctor () dans C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: ligne 30 \ r \ n à lambda_method ( Closure) \ r \ n à System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (requête HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, tapez controllerType) "}}
Lorsque j'ai commencé à regarder des assemblys, j'ai pu voir que mon projet Web et mon projet de service ciblaient différentes versions System.Net.Http
.
Projet Web:
Projet de service:
Il est facile de penser que cela est dû à une incohérence dans les versions, mais la clé ici est de regarder l'erreur The system cannot find the file specified.
.
En examinant la propriété path, nous pouvons voir que le projet Web cible un assembly .Net Framework tandis que le service cible un assembly de Visual Studio 2017. Étant donné que Visual Studio 2017 n'est pas installé sur le serveur, l'erreur d'exécution se produit.
Chemin Web:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll
Chemin du service:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
Quelque chose d'aussi simple que Copy Local
de true
régler le problème peut résoudre le problème, mais pas dans tous les cas.
Afin de reproduire l'erreur sur votre ordinateur local, supprimez simplement le nécessaire System.Net.Http.dll
du dossier spécifique à Visual Studio. Cela vous donnera l'erreur d'exécution et probablement quelques erreurs de construction. Une fois ceux-ci résolus, tout devrait fonctionner, du moins pour moi.
Si vous avez installé System.Net.Http
via, NuGet
vérifiez quel assemblage est utilisé en regardant la .csproj
version. System.Net.Http 4.3.4
donne par exemple l'assemblage suivant:
<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>
Si vous utilisez un serveur de build comme Jenkins, TeamCity ou AppVeyor, le runtime manquant .dll
peut également y exister. Dans ce cas, il peut ne pas être utile d'utiliser la version NuGet de System.Net.Http ou de supprimer les fichiers manquants .dll
localement. Pour résoudre cette erreur, regardez la version qui n'est pas trouvée et le spécifique PublicKeyToken
. Après cela, créez une redirection de liaison dans Web.config
ou en App.config
fonction de votre projet. Dans mon cas, je voudrais utiliser 4.0.0.0 à la place:
<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 bon fil de discussion Github sur le problème:
https://github.com/dotnet/corefx/issues/22781