Не вдалося завантажити файл або збірку “System.Net.Http, Версія = 4.0.0.0, Культура = нейтральна, PublicKeyToken = b03f5f7f11d50a3a”


168

Я скопіював свій проект на чисту машину Windows 10 із встановленими лише спільнотами Visual Studio 2015 та SQL Server 2016 Express. Немає інших версій фреймворку, встановлених окрім встановлених у Windows 10 та VS2015 чи SQL Server.

Коли я намагаюся запустити проект WebApi, я отримую повідомлення:

Не вдалося завантажити файл або збірку "System.Net.Http, Версія = 4.0.0.0, Культура = нейтральна, PublicKeyToken = b03f5f7f11d50a3a" або одна з її залежностей. Система не може знайти вказаний файл.

Пакети проекту включають:

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

Після побудови проекту з .NET Framework 4.6.1 System.Net.Httpфайл не знайдеться в binпапці.

Шлях файлу вказує на:

C: \ програмні файли (x86) \ довідкові збори \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Net.Http.dll

Шлях файлу System.Net.Http.Formattingвказує на:

C: \ розробка \ MyApp \ пакети \ Microsoft.AspNet.WebApi.Client.5.2.3 \ lib \ net45 \ System.Net.Http.Formatting.dll

Чи повинен цілий проект націлюватись на 4.5.1 чи є інший спосіб посилання на правильні збори?


ви намагалися перевстановити Web Api з пакету NuGet?
Михай Олександру-Іонут


Спробував усі запропоновані відповіді в цьому питанні. Поки що нічого не працює. Я теж бігавupdate-package xxx -reinstall до всіх пакунків, що використовуються. Це також не працює.
Іван-Марк Дебоно


Просто дивіться на це, спасибі мені пізніше stackoverflow.com/questions/50536842 / ...
Ragul

Відповіді:


114

Виконайте наступні кроки,

  1. Оновіть візуальну студію до останньої версії (це важливо)
  2. Видаліть усі переадресації прив’язки з web.config
  3. Додайте це до .csprojфайлу:

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. Побудуйте проект
  5. У binпапці має бути (WebAppName).dll.configфайл
  6. Він повинен мати переспрямування, скопіюйте їх у web.config
  7. Видаліть вищезгадане фрагмент з .csprojфайлу

Це має працювати


1
Тепер я не можу завантажити файл або збірку 'Newtonsoft.Json, версія = 6.0.0.0, культура = нейтральна, PublicKeyToken = 30ad4fe6b2a6aeed' або одна з її залежностей. Маніфестне визначення розташованої збірки не відповідає посиланням на збірку. (Виняток з HRESULT: 0x80131040)
EK_AllDay

2
Ви повинні пам'ятати, щоб скопіювати переспрямування, що зв'язуються, з генерованого файлу, тому вперше ви отримаєте вказану вище помилку, але перейдіть у папку бін, щоб отримати згенеровану (webappname) .dll.config, як описано вище, скопіюйте весь список переадресацій у свій web.config, після чого повторно компілюйте. Це дійсно допомогло мені, переконайтеся, що ви використовуєте інструмент консолідації нугів, щоб очистити стільки посилань, скільки ви можете спочатку.
Кріс Шалер

4
Дивовижний. Це насправді спрацювало для мене. @EK_AllDay Вам потрібно скопіювати AssemblyRedirects назад в оригінальний web.config.
Девід Де Слоувере

3
⭐☝ Значок легенди заслужив саме тут! Лише побічна примітка, коли я копіював AssemblyRedirects назад в web.config, я бачу, що для System.Net.Http більше немає прив'язки . Отже, ми припускаємо, що VS зараз використовує збірку за замовчуванням, упаковану з рамкою .Net, а не власною версією?
EvilDr

1
Ця відповідь врятувала мене стільки разів, що я навіть перестала рахувати. Слід позначити як відповідь ІМХО.
Себастьян Будка

258

Зміна інформації про зв'язування в моєму web.config (або app.config) - хоч, на мій погляд, "зламати", ви можете рухатися вперед до свого проекту після того, як оновлення пакету NuGet зірве вашу програму і надасть вам System.Net.Http помилка.

Встановити 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
Я розгорнувся в Azure, одного разу, без жодних проблем, потім через 15 хвилин, послідовне розгортання дало мені точну помилку, заявлену в ОП, і налаштування web.config на сервері з цією точною відповіддю виправило мою проблему. Але, я не маю уявлення, чому це колись спрацювало вперше. Я не возився зі своїми залежностями між розгортаннями.
bkwdesign

8
Хороша робота. Я бачу, що сталося, я встановив пакет в проект базового домену, в якому я впевнений, що встановлений нукет System.Net.Http (можливо, вищої версії 4.1.x), і як тільки я це зробив, я отримав ці попередження скрізь. Це вирішило проблему для веб-проекту, але порада когось звернутись до нут-пакету для цього у всіх проектах зняла всі попередження. Я єдиний, хто стурбований поєднанням старого та нового .NET, хоча мова йде про посилання? Це змушує мене посилатися на типово локальні dll як пакунки нугів (dll hell).
Микола Петерсен

3
Ось відповідь від Microsoft, чому це правильний шлях: github.com/dotnet/corefx/isissue/25773
ghanashyaml

18
Видалення переадресації прив’язки повністю працювало для мене.
sbkrogers

1
Так, просто видаліть рядки system.net.http та system.runtime. Тоді речі стають нормальними.
ZZZ

32

В одному з моїх проектів були цілі пакети з вищою версією System.Net.Http. і в моєму запусковому проекті є посилання на System.Net.Http v 4.0.0, я щойно встановив нульовий пакет System.Net.Http у своєму запуску проекту і проблема вирішена


У мене є три проекти у вирішенні - назвемо їх A, Bі C. Aє проект запуску, і не має нічого спільного ні з Bчи C. Cє тестовим проектом для B. CНе вдалося виконати тести , оскільки у мене не було довідкового проекту (System.Net.Http) A.
Rasmus Bækgaard


12

Якщо у вас є кілька проектів у вашому рішенні, клацніть правою кнопкою миші на піктограму рішення у Visual Studio та виберіть "Керувати пакетами NuGet для вирішення", а потім натисніть на четверту вкладку "Консолідувати", щоб консолідувати всі ваші проекти в одній версії DLL. Це дасть вам список посилань на збірки, які потрібно об'єднати. Клацніть кожен елемент у списку, а потім натисніть «Встановити» на вкладці, що відображається праворуч.


4
Поєднайте це з відповіддю від @sajeetharan про використання AutoGenerateBindingRedirects, здається, що в старих версіях або VS, або пакетів нугетів можуть залишатись неправильні твердження прив’язки. Гарне очищення може багато допомогти.
Кріс

11

Вище зв'язування переадресація не працює для мене , тому я закоментувавши посилання на System.Net.Httpв web.config. Здається, все без нього працює добре.

  <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
Це працює в Visual Studio 2017 (15.9.4) і дозволяє будувати за допомогою пакета NuGet System.Net.Http (4.3.4) замість прямої посилання на DLL, що постачається з рамковим випуском .NET 4.7.2. Щоб використовувати посилання, що надсилаються (без інших залежностей) в IDE, зробіть це: 1) Видаліть web / app.config обов'язкові переадресації 2) Видаліть пакет NuGet для System.Net.Http 3) Відкрийте "Додати нову довідку" та безпосередньо посилання до нової версії 4.2.0.0, яка постачається з .NET 4.7.
EnocNRoll - AnandaGopal Pardue

Це працювало для мене у VS2019, переносячи додаток з 4.6.1 на 4.7.2
cklimowski

У мене був проект консольного додатка, який працював як веб-робота. Цей виняток було викинутим під час створення клієнта api SendGrid. Все почало працювати після видалення перенаправлення прив’язки з app.config. Дякую, що ви запропонували це, я б ніколи не думав.
kurdemol94

9

Ви можете це виправити, оновивши проект до .NET Framework 4.7.2. На це відповів Олексій Гіондея - MSFT . Будь ласка, підкажіть його, як він справді цього заслуговує!

Це задокументовано як відомий випуск у .NET Framework 4.7.1.

Як вирішення, ви можете додати ці цілі до свого проекту. Вони видалять DesignFacadesToFilter зі списку посилань, переданих на SGEN (і додають їх назад, коли SGEN буде виконано)

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

Іншим варіантом (на машині широко) є додати таке перенаправлення прив'язки до 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.

Ця відповідь на вищезазначене питання посилання тепер є відповідною відповіддю: stackoverflow.com/a/52883065/54289 Детальну інформацію див. У коментарях до відповіді.
EnocNRoll - AnandaGopal Pardue

6

Це буде працювати в .NET 4.7.2 з Visual Studio 2017 (15.9.4):

  • Видаліть прив’язки перенаправлень веб / app.config
  • Видаліть пакет NuGet для System.Net.Http
  • Відкрийте "Додати нову довідку" та безпосередньо посилання на нову збірку 4.2.0.0, яка постачається з .NET 4.7.2

! [зображення] (https://user-images.githubusercontent.com/38843378/50998531-b5bb3a00-14f5-11e9-92df-6c590c469349.png)


4

У мене є те саме питання, і єдиним способом, як я можу це виправити, є додаванняindingRedirect до app.confing як написано @ tripletdad99.

Але якщо у вас є рішення з більшою кількістю проектів, це справді висмоктувати оновлення кожного проекту вручну (а також іноді після оновлення певного пакету нугів потрібно робити це ще раз). І це причина, чому я написав простий скрипт повноважень, який, якщо всі 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"

Приклад використання:

./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"

Напевно, це не ідеально, а також буде краще, якщо хтось зв’яже це з завданням заздалегідь.


3

4.6.1-2 у VS2017 користувачі можуть відчути небажану заміну своєї версії System.Net.Http на ту, яку VS2017 або Msbuild 15 хоче використовувати.

Тут ми видалили цю версію:

C: \ програмні файли (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

і ось:

C: \ програмні файли (x86) \ Microsoft Visual Studio \ 2017 \ BuildTools \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

Потім проект будується за версією, на яку ми посилалися через NuGet.


1

У мене це було, але це було тому, що я додав пакет NuGet, який оновив переадресації прив’язки. Як тільки я вийняв пакет, переадресації все ще були. Я видалив їх, а потім запустив update-package -reinstall. Це додало правильних переадресацій.


0

Перевірте версію .net Framework.
Моя оригінальна рамка .net - це старша версія.
Після того, як я встановив .net Framework 4.6, ця проблема вирішується автоматично.


0

Для мене я встановив, що мій проект працюватиме на останній версії .Net Framework (зміна від .Net Framework 4.6.1 до 4.7.2).

Все працювало, помилок не було і опубліковано без проблем, і лише випадково я натрапив на повідомлення про помилку System.Net.Http, показане в невеликому, важко помітному, але досить важливому запиті API на веб-сайті I ' м працює над.

Я відкотився до 4.6.1 і знову все добре.


0

Єдиним способом, який чітко вирішив цю проблему для мене (.NET 4.6.1), було не лише додати Nuget посилання на System.Net.Http V4.3.4 для проекту, який фактично використовував System.Net.Http, але і до стартовий проект (тестовий проект у моєму випадку).

(Що дивно, тому що правильний System.Net.Http.dll існував у директорії бін тестового проекту, а також .config зборка Bingings теж виглядала нормально.)


0

Оновлено старий веб-сайт за допомогою nuget (включаючи .Net оновлення та оновлення MVC).

Я видалив посилання System.Net.HTTP у VS2017 (це було у версії 2.0.0.0) і повторно додав посилання, яке потім показало 4.2.0.0.

Потім я оновив тонну "пакунків" за допомогою nuget і отримав повідомлення про помилку, потім помітив, що щось скинуло посилання на 2.0.0.0, тому я видалив і знову додав, і це працює чудово ... химерно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.