279 votes

Impossible de charger le fichier ou l'assemblage "System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".

J'ai copié mon projet sur une machine Windows 10 propre avec seulement Visual Studio 2015 Community et SQL Server 2016 Express installés. Il n'y a pas d'autres versions de frameworks installées en dehors de celles installées avec Windows 10 et VS2015 ou SQL Server.

Lorsque j'essaie de lancer le projet WebApi, j'obtiens le message suivant :

Impossible de charger le fichier ou l'assemblage "System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" ou l'une de ses dépendances. Le système ne trouve pas le fichier spécifié.

Les paquets du projet comprennent :

<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />

Après avoir construit le projet avec .NET Framework 4.6.1, System.Net.Http le fichier n'est pas trouvé dans le bin dossier.

Le chemin d'accès du fichier pointe vers :

C:\Program Fichiers (x86) \Reference Assemblages \Microsoft\Framework.NETFramework\v4.6.1\System.Net.Http.dll

Le chemin du fichier de System.Net.Http.Formatting pointe vers :

C:\Development\MyApp\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll

L'ensemble du projet doit-il viser la version 4.5.1 ou existe-t-il un autre moyen de référencer les bons assemblages ?

1 votes

Avez-vous essayé de réinstaller Web Api à partir du paquet NuGet ?

1 votes

0 votes

J'ai essayé toutes les réponses suggérées dans cette question SO. Rien ne fonctionne jusqu'à présent. J'ai également exécuté update-package xxx -reinstall pour tous les paquets nuget que j'utilise. Cela ne fonctionne pas non plus.

331voto

tripletdad99 Points 1576

Changer les informations de liaison dans mon web.config (ou app.config) - bien qu'il s'agisse d'un "hack" à mon avis, vous permet de poursuivre votre projet après qu'une mise à jour du paquet NuGet ait détruit votre application et vous ait donné l'erreur System.Net.Http.

Définir oldVersion="0.0.0.0-4.1.1.0" et newVersion="4.0.0.0" comme suit

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.0.0.0" />
</dependentAssembly>

6 votes

J'ai effectué un déploiement vers Azure, une fois, sans problème, puis 15 minutes plus tard, un déploiement successif m'a donné l'erreur exacte indiquée dans le manuel d'utilisation et le fait de modifier le web.config sur le serveur avec cette réponse précise a réglé mon problème. Mais, je n'ai aucune idée de la raison pour laquelle cela a fonctionné la première fois. Je n'ai pas modifié mes dépendances entre les déploiements.

11 votes

Bon travail. Je peux voir ce qui s'est passé, j'ai installé un paquet dans un projet de domaine de base qui, j'en suis presque sûr, avait System.Net.Http nuget installé (probablement de la version supérieure 4.1.x), et dès que j'ai fait cela, j'ai eu ces avertissements partout. Cela a réglé le problème pour le projet web, mais le conseil ci-dessus de quelqu'un de référencer le paquet nuget pour cela dans tous les projets a supprimé tous les avertissements. Suis-je le seul à être préoccupé par le mélange de l'ancien et du nouveau .NET en matière de références ? Cela me fait peur de référencer des dlls typiquement locales comme des paquets nuget (l'enfer des dlls).

6 votes

Voici la réponse de Microsoft qui explique pourquoi cette méthode est la bonne : github.com/dotnet/corefx/issues/25773

306voto

Sajeetharan Points 108195

Suivez les étapes suivantes,

  1. Mettre à jour Visual Studio à la dernière version (cela compte)

  2. Supprimer toutes les redirections de liaison de web.config

  3. Ajoutez ceci à la .csproj fichier :

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. Construire le projet

  5. Dans le bin il devrait y avoir un (WebAppName).dll.config fichier

  6. Il devrait contenir des redirections, copiez-les dans le fichier web.config

  7. Retirez ce qui précède, extrait du .csproj fichier

Cela devrait fonctionner

2 votes

Je reçois maintenant le message suivant : Impossible de charger le fichier ou l'assemblage 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' ou l'une de ses dépendances. La définition du manifeste de l'assemblage localisé ne correspond pas à la référence de l'assemblage. (Exception de HRESULT : 0x80131040)

4 votes

Vous devez vous rappeler de copier les redirections du fichier généré, donc la première fois vous obtiendrez l'erreur ci-dessus, mais allez dans le dossier bin pour obtenir le fichier (webappname).dll.config généré comme décrit ci-dessus, copiez la liste complète des redirections dans votre web.config, puis recompilez. Cela m'a vraiment aidé, mais assurez-vous d'utiliser l'outil de consolidation nuget pour nettoyer autant de références que possible.

8 votes

Incroyable. Ça a marché pour moi. @EK_AllDay Vous devez recopier les AssemblyRedirects dans le web.config original.

40voto

Ram Points 120

Dans un de mes projets, il y avait un paquet nuget avec une version plus élevée de System.Net.Http. et dans mon projet de démarrage, il y a une référence à System.Net.Http v 4.0.0 , je viens d'installer Paquet nuget System.Net.Http dans mon projet de démarrage et le problème est résolu.

1 votes

J'ai trois projets dans une solution - appelons-les A , B et C . A est le projet de démarrage, et n'a rien à voir avec l'un ou l'autre des projets suivants B ou C . C est un projet de test pour B . J'exécute mes tests dans C a échoué, car je n'avais pas de projet de référence (System.Net.Http) A avait.

13voto

TruthSeeker Points 449

Si vous avez plusieurs projets dans votre solution, cliquez avec le bouton droit de la souris sur l'icône de la solution dans Visual Studio et sélectionnez 'Manage NuGet Packages for Solution', puis cliquez sur le quatrième onglet 'Consolidate' pour consolider tous vos projets avec la même version des DLLs. Vous obtiendrez alors une liste des assemblages référencés à consolider. Cliquez sur chaque élément de la liste, puis cliquez sur installer dans l'onglet qui apparaît à droite.

4 votes

Si l'on combine cela avec la réponse de @sajeetharan concernant l'utilisation de l'AutoGenerateBindingRedirects, il semble que les anciennes versions de VS ou des paquets nuget puissent laisser des déclarations de liaison incorrectes. Un bon nettoyage peut être d'une grande aide.

4voto

Jiri Sykora Points 359

J'ai le même problème et la seule façon de le résoudre est d'ajouter bindingRedirect à app.confing comme l'a écrit @tripletdad99.

Mais si vous avez la solution avec plus de projet est vraiment craindre mettre à jour chaque projet à la main (et aussi parfois après la mise à jour de certains paquets nuget vous devez le faire à nouveau). Et c'est la raison pour laquelle j'ai écrit un simple powershell script qui si toutes les app.configs.

 param(
    [string]$SourceDirectory,
    [string]$Package,
    [string]$OldVersion,
    [string]$NewVersion
)

Write-Host "Start fixing app.config in $sourceDirectory"
Write-Host "$Package set oldVersion to $OldVersion and newVersion $NewVersion"
Write-Host "Search app.config files.."
[array]$files = get-childitem $sourceDirectory -Include app.config App.config -Recurse | select -expand FullName
foreach ($file in $files)
{
    Write-Host $file
    $xml = [xml](Get-Content $file)
    $daNodes = $xml.configuration.runtime.assemblyBinding.dependentAssembly
    foreach($node in $daNodes)
    {
        if($node.assemblyIdentity.name -eq $package)
        {
            $updateNode = $node.bindingRedirect
            $updateNode.oldVersion = $OldVersion
            $updateNode.newVersion =$NewVersion
            Write-Host "Fix"
        }
    }
    $xml.Save($file)
}

Write-Host "Done"

Exemple d'utilisation :

./scripts/FixAppConfig.ps1 -SourceDirectory "C:\project-folder" -Package "System.Net.Http" -OldVersion "0.0.0.0-4.3.2.0" -NewVersion "4.0.0.0"

Il n'est probablement pas parfait et il serait préférable que quelqu'un le relie à la tâche de pré-construction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X