Не удалось загрузить файл или сборку «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файла

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


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>

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.
Расмус Бокгаард


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)


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.


1

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


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 тоже выглядела нормально.)


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.