Не удалось загрузить файл или сборку «System.Net.Http, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a»

168

Я скопировал свой проект на чистый компьютер с Windows 10, на котором установлены только Visual Studio 2015 Community и 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: \ Program Files (x86) \ Справочные сборки \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Net.Http.dll

Путь к файлу System.Net.Http.Formattingуказывает на:

C: \ Development \ 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за всеми пакетами nuget, которые я использую. Это тоже не работает.
Иван-Марк Дебоно
Просто сошлитесь на это, спасибо мне позже stackoverflow.com/questions/50536842/…
Ragul

Ответы:

116

Выполните следующие шаги,

  1. Обновите visual studio до последней версии (это важно)
  2. Удалить все обязательные перенаправления из web.config
  3. Добавьте это в .csprojфайл:

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

Он должен работать

Sajeetharan
источник
1
Теперь я получаю Не удалось загрузить файл или сборку 'Newtonsoft.Json, Версия = 6.0.0.0, Культура = Нейтральный, PublicKeyToken = 30ad4fe6b2a6aeed' или одна из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
EK_AllDay
2
Не забудьте скопировать перенаправления привязки из сгенерированного файла, поэтому в первый раз вы получите вышеуказанную ошибку, но перейдите в папку bin, чтобы получить сгенерированный (webappname) .dll.config, как описано выше, скопируйте весь список перенаправлений в ваш web.config, затем перекомпилируйте. Это действительно помогло мне, убедитесь, что вы используете инструмент консолидации nuget, чтобы сначала очистить как можно больше ссылок.
Крис Шаллер
4
Удивительный. Это на самом деле работает для меня. @EK_AllDay Вы должны скопировать AssemblyRedirects обратно в исходный файл web.config.
Дэвид Де Слововере
3
⭐☝ Легендарный значок заслужен прямо здесь! Просто примечание: когда я скопировал AssemblyRedirects обратно в web.config, я вижу, что больше нет привязки для System.Net.Http . Итак, мы предполагаем, что VS теперь использует сборку по умолчанию, упакованную с .Net framework, а не свою собственную версию?
EvilDr
1
Этот ответ спас меня так много раз, что я даже перестал считать. Должен быть помечен как ответ ИМХО.
Себастьян Будка
258

Изменение информации о связывании в моем web.config (или app.config) - хотя, на мой взгляд, «хак» позволяет вам двигаться вперед с вашим проектом после того, как обновление пакета NuGet ударит ваше приложение и даст вам System.Net.Http ошибка.

Set 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>
tripletdad99
источник
4
Однажды я развернул в Azure без проблем, затем через 15 минут последовательное развертывание дало мне точную ошибку, указанную в OP, и настройка web.config на сервере с этим точным ответом устранила мою проблему. Но я понятия не имею, почему это сработало с первого раза. Я не связывался со своими зависимостями между развертываниями.
bkwdesign
8
Хорошая работа. Я вижу, что произошло, я установил пакет в проекте базового домена, в котором, я уверен, установлен Nuget System.Net.Http (вероятно, более высокой версии 4.1.x), и как только я это сделал, я получил эти предупреждения везде. Это устранило проблему для веб-проекта, но приведенный выше совет кого-то ссылаться на пакет nuget для этого во всех проектах удалил все предупреждения. Я единственный, кто обеспокоен сочетанием старого и нового .NET, когда дело доходит до ссылок? Это заставляет меня бояться ссылаться на типичные локальные dll как пакеты nuget (dll hell).
Николай Петерсен
3
Вот ответ от Microsoft о том, почему это правильный путь: github.com/dotnet/corefx/issues/25773
ghanashyaml
18
Удаление перенаправления привязки полностью работало для меня.
sbkrogers
1
Да, просто удалите строки system.net.http и system.runtime. Тогда все станет хорошо.
ZZZ
32

В одном из моих проектов был пакет nuget с более высокой версией System.Net.Http. и в моем проекте запуска есть ссылка на System.Net.Http v 4.0.0, я только что установил пакет nuget System.Net.Http в свой проект запуска, и проблема решена

ОЗУ
источник
У меня есть три проекта в решении - давайте назовем их A, Bи C. Aявляется проект запуска, и не имеет ничего общего ни с Bили C. Cэто тестовый проект для B. Запуск моих тестов Cне удался, потому что у меня не было эталонного проекта (System.Net.Http) A.
Расмус Бокгаард
19

Изменить следующее:

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

со следующим:

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

в web.config

Мухаммед Вакас
источник
1
Ты гангстер. Это решило мою проблему!
Леонардо Вильдт
1
Спасибо @LeonardoWildt
Мухаммед Вакас
12

Если в вашем решении есть несколько проектов, щелкните правой кнопкой мыши значок решения в Visual Studio и выберите «Управление пакетами NuGet для решения», затем нажмите четвертую вкладку «Консолидация», чтобы объединить все ваши проекты в одну и ту же версию библиотеки DLL. Это даст вам список ссылочных сборок для консолидации. Нажмите на каждый элемент в списке, затем нажмите «Установить» на вкладке, которая появляется справа.

Искатель правды
источник
4
Объедините это с ответом @sajeetharan об использовании AutoGenerateBindingRedirects. Похоже, что более старые версии VS или пакетов nuget могут оставлять неправильные операторы связывания. Хорошая очистка может очень помочь.
Крис Шаллер
11

Вышеприведенный bind-redirect у меня не сработал, поэтому я закомментировал ссылку на System.Net.Httpin 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):

  • Удалите перенаправления привязки web / 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)

EnocNRoll - AnandaGopal Pardue
источник
4

У меня та же проблема, и единственный способ, как я могу это исправить, это добавить bindingRedirect в app.confing, как писал @ tripletdad99.

Но если у вас есть решение с большим количеством проектов, вам действительно нужно обновлять каждый проект вручную (а также иногда после обновления какого-либо пакета nuget, вам нужно сделать это снова). И это причина, почему я написал простой скрипт powershell, который, если все 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: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

и тут:

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

Затем проект собирается с версией, на которую мы ссылались через NuGet.

jaybro
источник
1

У меня было это, но это было, потому что я добавил пакет NuGet, который обновил перенаправления привязки. Как только я удалил пакет, перенаправления все еще были там. Я удалил их все, а затем запустил update-package -reinstall. Это добавило правильные перенаправления.

SwampyFox
источник
0

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

Фрэнк Мьят Чт
источник
0

Для меня я настроил свой проект на работу с последней версией .Net Framework (изменение с .Net Framework 4.6.1 на 4.7.2).

Все работало, без ошибок и публиковалось без проблем, и только случайно я наткнулся на сообщение об ошибке System.Net.Http, отображаемое в небольшом, трудно заметном, но довольно важном API-запросе к веб-сайту, на котором я находился ». Я работаю над.

Я откатился на 4.6.1 и все снова нормально.

Стюарт Айткен
источник
0

Единственный способ, который чисто решил эту проблему для меня (.NET 4.6.1), это не только добавить ссылку Nuget на System.Net.Http V4.3.4 для проекта, который фактически использовал System.Net.Http, но и на проект запуска (тестовый проект в моем случае).

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

TvdH
источник
0

Обновлял старый сайт, используя nuget (включая обновление .Net и обновление MVC).

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

Затем я обновил тонну «пакетов», используя nuget, и получил сообщение об ошибке, затем заметил, что что-то сбросило ссылку на 2.0.0.0, поэтому я удалил и снова добавил, и все работает нормально ... странно.

Пол Захра
источник