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


168

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

Lorsque j'essaye de démarrer le projet WebApi, je reçois le message:

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

Les packages 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 généré le projet avec .NET Framework 4.6.1, System.Net.Httple fichier est introuvable dans le bindossier.

Le chemin du fichier pointe vers:

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

Le chemin du fichier System.Net.Http.Formattingpointe 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 cibler 4.5.1 ou existe-t-il une autre façon de référencer les bons assemblages?


avez-vous essayé de réinstaller Web Api à partir du package NuGet?
Mihai Alexandru-Ionut


J'ai essayé toutes les réponses suggérées dans cette question SO. Rien ne fonctionne jusqu'à présent. J'ai également couru update-package xxx -reinstallpour tous les paquets nuget que j'utilise. Cela ne marche pas non plus.
Ivan-Mark Debono


Reportez-vous simplement ceci, merci plus tard stackoverflow.com/questions/50536842/…
Ragul

Réponses:


116

Suivez les étapes suivantes,

  1. Mettez à jour Visual Studio vers la dernière version (cela compte)
  2. Supprimer toutes les redirections de liaison de web.config
  3. Ajoutez ceci au .csprojfichier:

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. Construisez le projet
  5. Dans le bindossier, il devrait y avoir un (WebAppName).dll.configfichier
  6. Il devrait contenir des redirections, copiez-les dans le web.config
  7. Supprimer ce qui précède extrait du .csprojfichier

Ça devrait marcher


1
Now im getting Impossible de charger le fichier ou l'assembly 'Newtonsoft.Json, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' ou l'une de ses dépendances. La définition de manifeste de l'assembly localisé ne correspond pas à la référence d'assembly. (Exception de HRESULT: 0x80131040)
EK_AllDay

2
Vous devez vous rappeler de copier à travers les redirections de liaison à partir du fichier généré, donc la première fois que vous obtiendrez l'erreur ci-dessus, mais allez dans le dossier bin pour obtenir le (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é, assurez-vous d'utiliser l'outil de consolidation de pépites pour nettoyer autant de références que possible.
Chris Schaller

4
Incroyable. Cela a fonctionné pour moi. @EK_AllDay Vous devez recopier les AssemblyRedirects dans le fichier web.config d'origine.
David De Sloovere

3
⭐☝ Badge de légende mérité ici! Juste une remarque, lorsque j'ai copié les AssemblyRedirects dans web.config, je vois qu'il n'y a plus de liaison pour System.Net.Http . Nous supposons donc que VS utilise désormais l'assembly par défaut fourni avec le framework .Net, plutôt que sa propre version?
EvilDr

1
Cette réponse m'a sauvé tellement de fois que j'ai même arrêté de compter. Doit être marqué comme réponse IMHO.
Sebastian Budka

258

Modifier les informations de liaison dans mon web.config (ou app.config) - bien qu'un "hack" à mon avis, vous permet d'avancer dans votre projet après qu'une mise à jour du package NuGet bloque votre application et vous donne le System.Net.Http Erreur.

Définir newVersion = "4.0.0.0"

<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>

4
J'ai déployé sur Azure, une fois, sans problème, puis 15 minutes plus tard, un déploiement successif m'a donné l'erreur exacte indiquée dans l'OP et l'ajustement du web.config sur le serveur avec cette réponse précise a résolu mon problème. Mais, je ne sais pas pourquoi cela a fonctionné la première fois. Je n'ai pas joué avec mes dépendances entre les déploiements.
bkwdesign

8
Bon travail. Je peux voir ce qui s'est passé, j'ai installé un package dans un projet de domaine de base sur lequel je suis à peu près sûr que System.Net.Http nuget était installé (probablement de la version supérieure 4.1.x), et dès que je l'ai fait, je les ai reçus avertissements partout. Cela a résolu le problème pour le projet Web, mais le conseil ci-dessus de quelqu'un de référencer le package 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 quand il s'agit de références? Cela me fait peur de faire référence aux dll typiquement locales comme des paquets nuget (dll hell).
Nicholas Petersen

3
Voici la réponse de Microsoft expliquant pourquoi c'est la bonne façon: github.com/dotnet/corefx/issues/25773
ghanashyaml

18
La suppression de la redirection de liaison a complètement fonctionné pour moi.
sbkrogers

1
Oui, supprimez simplement les lignes de system.net.http et system.runtime. Les choses deviennent alors bien.
ZZZ

32

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


J'ai trois projets dans une solution - appelons-les A, Bet C. Aest le projet de démarrage et n'a rien à voir avec ni Bni C. Cest un projet de test pour B. L'exécution de mes tests a Céchoué, car je n'avais pas de projet de référence (System.Net.Http) A.
Rasmus Bækgaard

19

Changement suivant:

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />

avec ce qui suit:

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0" />

dans web.config


1
Tu es un gangster. Cela a résolu mon problème!
Leonardo Wildt

1
Merci @LeonardoWildt
Muhammad Waqas

12

Si vous avez plusieurs projets dans votre solution, cliquez avec le bouton droit sur l'icône de la solution dans Visual Studio et sélectionnez `` Gérer les packages NuGet pour la solution '', puis cliquez sur le quatrième onglet `` Consolider '' pour consolider tous vos projets dans la même version du DLL. Cela vous donnera une liste d'assemblys 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
Combinez cela avec la réponse de @sajeetharan sur l'utilisation des AutoGenerateBindingRedirects, il semble que les anciennes versions des packages VS ou nuget peuvent laisser des instructions de liaison incorrectes. Un bon nettoyage peut aider beaucoup.
Chris Schaller

11

La redirection de liaison ci-dessus n'a pas fonctionné pour moi, j'ai donc commenté la référence à System.Net.Httpin web.config. Tout semble fonctionner correctement sans cela.

  <system.web>
    <compilation debug="true" targetFramework="4.7.2">
      <assemblies>
        <!--<add assembly="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />-->
        <add assembly="System.ComponentModel.Composition, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
      </assemblies>
    </compilation>
    <customErrors mode="Off" />
    <httpRuntime targetFramework="4.7.2" />
  </system.web>

1
Cela fonctionne dans Visual Studio 2017 (15.9.4) et vous permet de générer avec le package NuGet System.Net.Http (4.3.4) au lieu d'une référence directe à la DLL fournie avec la version de l'infrastructure .NET 4.7.2. Pour utiliser la référence fournie (sans aucune autre dépendance introduite) dans l'EDI, procédez comme suit: 1) Supprimez les redirections de liaison web / app.config 2) Supprimez le package NuGet pour System.Net.Http 3) Ouvrez «Ajouter une nouvelle référence» et liez directement à la nouvelle version 4.2.0.0 fournie avec .NET 4.7.
EnocNRoll - AnandaGopal Pardue

Cela a fonctionné pour moi dans VS2019, migrant une application de 4.6.1 à 4.7.2
cklimowski

J'avais un projet d'application console qui fonctionnait comme un webjob. Il lançait cette exception lors de la création d'un client API SendGrid. Tout a commencé à fonctionner après la suppression de la redirection de liaison de app.config. Merci d'avoir suggéré cela, je n'aurais jamais pensé.
kurdemol94

9

Vous pouvez résoudre ce problème en mettant à niveau votre projet vers .NET Framework 4.7.2. Cela a été répondu par Alex Ghiondea - MSFT . S'il vous plaît, montez-le comme il le mérite vraiment!

Ceci est documenté comme un problème connu dans .NET Framework 4.7.1.

Pour contourner ce problème, vous pouvez ajouter ces cibles à votre projet. Ils supprimeront DesignFacadesToFilter de la liste des références transmises à SGEN (et les rajouteront une fois SGEN terminé)

<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <DesignFacadesToFilter Include="System.IO.Compression.ZipFile" />
    <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" 
        Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" /> 
    <ReferencePath Remove="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." /> </Target>

<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <ReferencePath Include="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has ran." />
</Target>

Une autre option (à l'échelle de la machine) consiste à ajouter la redirection de liaison suivante à sgen.exe.config:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime> This will only work on machines with .NET Framework 4.7.1. installed. Once .NET Framework 4.7.2 is installed on that machine, this workaround should be removed.

Cette réponse à la question de lien ci-dessus est maintenant la réponse pertinente: stackoverflow.com/a/52883065/54289 Voir les commentaires sur la réponse pour plus de détails.
EnocNRoll - AnandaGopal Pardue

6

Cela fonctionnera dans .NET 4.7.2 avec Visual Studio 2017 (15.9.4):

  • Supprimer les redirections de liaison web / app.config
  • Supprimer le package NuGet pour System.Net.Http
  • Ouvrez "Ajouter une nouvelle référence" et créez un lien direct vers la nouvelle version 4.2.0.0 fournie avec .NET 4.7.2

! [image] (https://user-images.githubusercontent.com/38843378/50998531-b5bb3a00-14f5-11e9-92df-6c590c469349.png)


4

J'ai le même problème et le seul moyen de le résoudre est d'ajouter bindingRedirect à app.confing comment écrit @ tripletdad99.

Mais si vous avez une solution avec plus de projet, c'est vraiment nul de mettre à jour chaque projet à la main (et aussi parfois après la mise à jour d'un package nuget, vous devez le refaire). Et c'est la raison pour laquelle j'ai écrit un simple script PowerShell qui si tout 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"

Ce n'est probablement pas parfait et il sera également préférable que quelqu'un le lie à une tâche de pré-construction.


3

4.6.1-2 dans VS2017, les utilisateurs peuvent rencontrer le remplacement indésirable de leur version de System.Net.Http par celle que VS2017 ou Msbuild 15 souhaite utiliser.

Nous avons supprimé cette version ici:

C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

et ici:

C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ BuildTools \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

Ensuite, le projet se construit avec la version que nous avons référencée via NuGet.


1

J'avais ceci, mais c'était parce que j'avais ajouté un package NuGet qui avait mis à jour les redirections de liaison. Une fois que j'ai supprimé le package, les redirections étaient toujours là. Je les ai tous supprimés, puis j'ai exécuté update-package -reinstall. Cela a ajouté les bonnes redirections.


0

Vérifiez la version du framework .net.
Mon framework .net d'origine est une version plus ancienne.
Après avoir installé .net framework 4.6, ce problème est automatiquement résolu.


0

Pour moi, j'avais configuré mon projet pour qu'il s'exécute sur la dernière version de .Net Framework (un changement de .Net Framework 4.6.1 à 4.7.2).

Tout a fonctionné, aucune erreur et publié sans problème, et ce n'est que par hasard que je suis tombé sur le message d'erreur System.Net.Http, affiché dans une petite demande d'API difficile à remarquer, mais assez importante sur le site Web. Je travaille sur.

Je suis revenu à 4.6.1 et tout va bien à nouveau.


0

La seule façon qui a résolu proprement ce problème pour moi (.NET 4.6.1) était non seulement d'ajouter une référence Nuget à System.Net.Http V4.3.4 pour le projet qui utilisait réellement System.Net.Http, mais aussi au projet de démarrage (un projet de test dans mon cas).

(Ce qui est étrange, car le System.Net.Http.dll correct existait dans le répertoire bin du projet de test et l'assembly .configBingings semblait également correct.)


0

Mise à jour d'un ancien site Web à l'aide de nuget (y compris la mise à jour .Net et la mise à jour MVC).

J'ai supprimé la référence System.Net.HTTP dans VS2017 (il s'agissait de la version 2.0.0.0) et j'ai rajouté la référence, qui montrait alors 4.2.0.0.

J'ai ensuite mis à jour une tonne de 'packages' en utilisant nuget et j'ai reçu le message d'erreur, puis j'ai remarqué que quelque chose avait réinitialisé la référence à 2.0.0.0, alors j'ai supprimé et rajouté à nouveau et cela fonctionne bien ... bizarre.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.