No se pudo cargar el archivo o ensamblado "System.Net.Http, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a"

168

Copié mi proyecto en una máquina limpia de Windows 10 con solo Visual Studio 2015 Community y SQL Server 2016 Express instalado. No hay otras versiones de framework instaladas aparte de las instaladas con Windows 10 y VS2015 o SQL Server.

Cuando intento iniciar el proyecto WebApi, recibo el mensaje:

No se pudo cargar el archivo o ensamblado "System.Net.Http, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a" o una de sus dependencias. El sistema no puede encontrar el archivo especificado.

Los paquetes del proyecto incluyen:

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

Después de compilar el proyecto con .NET Framework 4.6.1, System.Net.Httpel archivo no se encuentra en elbin carpeta.

La ruta del archivo apunta a:

C: \ Archivos de programa (x86) \ Ensamblados de referencia \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Net.Http.dll

La ruta del archivo de System.Net.Http.Formattingpuntos a:

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

¿Debería todo el proyecto apuntar a 4.5.1 o hay otra forma de hacer referencia a los ensamblajes correctos?

Ivan-Mark Debono
fuente
¿Has intentado reinstalar Web Api desde el paquete NuGet?
Mihai Alexandru-Ionut
Intenté todas las respuestas sugeridas en esa pregunta SO. Nada funciona hasta ahora. También he corrido update-package xxx -reinstallpara todos los paquetes nuget que estoy usando. Tampoco funciona.
Ivan-Mark Debono
Reglas de seg. De herencia
Michael Freidgeim
Simplemente refiérase esto, gracias más tarde stackoverflow.com/questions/50536842/…
Ragul

Respuestas:

116

Sigue los siguientes pasos,

  1. Actualice Visual Studio a la última versión (es importante)
  2. Eliminar todos los redireccionamientos vinculantes de web.config
  3. Agregue esto al .csprojarchivo:

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. Construye el proyecto
  5. En la bincarpeta debería haber un(WebAppName).dll.config archivo
  6. Debería tener redireccionamientos, copiarlos en el web.config
  7. Eliminar lo anterior recortado del .csprojarchivo

Deberia de funcionar

Sajeetharan
fuente
1
Ahora estoy obteniendo No se pudo cargar el archivo o ensamblado 'Newtonsoft.Json, Versión = 6.0.0.0, Cultura = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' o una de sus dependencias. La definición de manifiesto del ensamblado ubicado no coincide con la referencia del ensamblado. (Excepción de HRESULT: 0x80131040)
EK_AllDay
2
Debe recordar copiar a través de los redireccionamientos de enlace desde el archivo generado, por lo que la primera vez obtendrá el error anterior, pero vaya a la carpeta bin para obtener el (dll.config) (copiado) como se describe arriba, copie la lista completa de redireccionamientos en su web.config, luego vuelva a compilar. Esto realmente me ayudó, asegúrate de usar la herramienta de consolidación nuget para limpiar tantas referencias como puedas primero.
Chris Schaller
44
Asombroso. Esto realmente funcionó para mí. @EK_AllDay Debe volver a copiar los AssemblyRedirects en el archivo web.config original.
David De Sloovere
3
⭐☝ ¡La insignia de la leyenda merece aquí! Solo una nota al margen, cuando copié los AssemblyRedirects de nuevo en web.config, veo que ya no hay un enlace para System.Net.Http . Entonces, ¿suponemos que VS ahora está usando el ensamblaje predeterminado empaquetado con el marco .Net, en lugar de su propia versión?
EvilDr
1
Esta respuesta me salvó tantas veces que incluso dejé de contar. Debe marcarse como respuesta en mi humilde opinión.
Sebastian Budka
258

Cambiar la información de enlace en mi web.config (o app.config), aunque es un "hack" en mi opinión, le permite avanzar con su proyecto después de que una actualización del paquete NuGet golpea su aplicación y le proporciona el System.Net.Http error.

Establecer 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
fuente
44
Implementé en Azure, una vez, sin problemas, luego, 15 minutos después, una implementación sucesiva me dio el error exacto indicado en el OP y al ajustar el web.config en el servidor con esta respuesta precisa se solucionó mi problema. Pero, no tengo idea de por qué funcionó la primera vez. No me metí con mis dependencias entre implementaciones.
bkwdesign
8
Buen trabajo. Puedo ver lo que sucedió, instalé un paquete en un proyecto de dominio base que estoy bastante seguro de que tenía instalado System.Net.Http nuget (probablemente de la versión 4.1.x superior), y tan pronto como lo hice, obtuve estos advertencias en todas partes. Esto solucionó el problema para el proyecto web, pero el consejo anterior de alguien de hacer referencia al paquete nuget para eso en todos los proyectos eliminó todas las advertencias. ¿Soy el único que está preocupado por la combinación de lo antiguo y lo nuevo .NET cuando se trata de referencias? Me da miedo hacer referencia a dlls típicamente locales como paquetes nuget (dll hell).
Nicholas Petersen
3
Aquí hay una respuesta de Microsoft sobre por qué esta es la forma correcta: github.com/dotnet/corefx/issues/25773
ghanashyaml
18
Eliminar la redirección de enlace funcionó por completo para mí.
sbkrogers
1
Sí, simplemente elimine las líneas de system.net.http y system.runtime. Entonces las cosas se ponen bien.
ZZZ
32

En uno de mis proyectos había un paquete nuget con una versión superior de System.Net.Http. y en mi proyecto de inicio hay referencia a System.Net.Http v 4.0.0, acabo de instalar el paquete Nuget System.Net.Http en mi proyecto de inicio y el problema se resolvió

RAM
fuente
Tengo tres proyectos en una solución - llamémosles A, By C. Aes el proyecto de inicio, y no tiene nada que ver con ninguno Bo C. Ces un proyecto de prueba para B. La ejecución de mis pruebas Cfalló porque no tenía un proyecto de referencia (System.Net.Http) A.
Rasmus Bækgaard
19

Cambiar siguiente:

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

con lo siguiente:

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

en web.config

Muhammad Waqas
fuente
1
Eres un gángster ¡Esto resolvió mi problema!
Leonardo Wildt
1
Gracias @LeonardoWildt
Muhammad Waqas
12

Si tiene varios proyectos en su solución, haga clic con el botón derecho en el icono de la solución en Visual Studio y seleccione 'Administrar paquetes NuGet para la solución', luego haga clic en la cuarta pestaña 'Consolidar' para consolidar todos sus proyectos en la misma versión del DLL. Esto le dará una lista de ensamblados referenciados para consolidar. Haga clic en cada elemento de la lista, luego haga clic en instalar en la pestaña que aparece a la derecha.

Buscador de la verdad
fuente
44
Combine esto con la respuesta de @sajeetharan sobre el uso de AutoGenerateBindingRedirects, parece que las versiones anteriores de VS o paquetes nuget pueden dejar declaraciones de enlace incorrectas. Una buena limpieza puede ayudar mucho.
Chris Schaller
11

El bind-redirect anterior no funcionó para mí, así que comenté la referencia a System.Net.Httpin web.config. Todo parece funcionar bien sin él.

  <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>
marca
fuente
1
Esto funciona en Visual Studio 2017 (15.9.4) y le permite construir con el paquete NuGet System.Net.Http (4.3.4) en lugar de una referencia directa a la DLL que se incluye con la versión de marco .NET 4.7.2. Para utilizar la referencia enviada (sin otras dependencias introducidas) dentro del IDE, haga esto: 1) Elimine los redireccionamientos de enlace web / app.config 2) Elimine el paquete NuGet para System.Net.Http 3) Abra "Agregar nueva referencia" y enlace directamente a la nueva compilación 4.2.0.0 que se incluye con .NET 4.7.
EnocNRoll - AnandaGopal Pardue
Esto funcionó para mí en VS2019, migrando una aplicación de 4.6.1 a 4.7.2
cklimowski
Tenía un proyecto de aplicación de consola que funcionaba como trabajo web. Estaba lanzando esa excepción al crear un cliente de API SendGrid. Todo comenzó a funcionar después de eliminar la redirección de enlace de app.config. Gracias por sugerir esto, nunca lo habría pensado.
kurdemol94
9

Puede solucionar esto actualizando su proyecto a .NET Framework 4.7.2. Esto fue respondido por Alex Ghiondea - MSFT . ¡Por favor, vótenlo como realmente se lo merece!

Esto está documentado como un problema conocido en .NET Framework 4.7.1.

Como solución alternativa, puede agregar estos objetivos a su proyecto. Eliminarán DesignFacadesToFilter de la lista de referencias pasadas a SGEN (y las agregarán nuevamente una vez que SGEN haya terminado)

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

Otra opción (en toda la máquina) es agregar la siguiente redirección de enlace a 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.
Boško Bezik
fuente
Esta respuesta en la pregunta de enlace anterior es ahora la respuesta relevante: stackoverflow.com/a/52883065/54289 Consulte los comentarios en la respuesta para obtener más detalles.
EnocNRoll - AnandaGopal Pardue
6

Esto funcionará en .NET 4.7.2 con Visual Studio 2017 (15.9.4):

  • Eliminar las redirecciones de enlace web / app.config
  • Eliminar el paquete NuGet para System.Net.Http
  • Abra "Agregar nueva referencia" y enlace directamente a la nueva compilación 4.2.0.0 que se incluye con .NET 4.7.2

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

EnocNRoll - AnandaGopal Pardue
fuente
4

Tengo el mismo problema y la única forma en que puedo solucionarlo es agregando bindingRedirect a app.confing cómo escribió @ tripletdad99.

Pero si tiene una solución con más proyectos, realmente es una mala actualización actualizar cada proyecto a mano (y también a veces después de actualizar algún paquete Nuget, debe hacerlo nuevamente). Y es la razón por la que escribí un script simple de PowerShell que, si todo 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"

Ejemplo de uso:

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

Probablemente no sea perfecto y también será mejor si alguien lo vincula a la tarea previa a la compilación.

Jiri Sykora
fuente
3

4.6.1-2 en VS2017 los usuarios pueden experimentar el reemplazo no deseado de su versión de System.Net.Http por la que VS2017 o Msbuild 15 quiere usar.

Eliminamos esta versión aquí:

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

y aquí:

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

Luego, el proyecto se construye con la versión a la que hemos hecho referencia a través de NuGet.

jaybro
fuente
1

Tenía esto, pero fue porque había agregado un paquete NuGet que había actualizado las redirecciones de enlace. Una vez que eliminé el paquete, las redirecciones todavía estaban allí. Los eliminé todos y luego ejecuté update-package -reinstall. Esto agregó las redirecciones correctas.

SwampyFox
fuente
0

Verifique la versión del framework .net.
Mi marco .net original es una versión anterior.
Después de instalar .net framework 4.6, este problema se resuelve automáticamente.

Frank Myat Thu
fuente
0

Para mí, había configurado mi proyecto para ejecutarse en la última versión de .Net Framework (un cambio de .Net Framework 4.6.1 a 4.7.2).

Todo funcionó, sin errores y publicado sin problemas, y fue solo por casualidad que me encontré con el mensaje de error System.Net.Http, que se muestra en una solicitud de API pequeña, difícil de notar, pero bastante importante sobre el sitio web I ' Estoy trabajando en

Regresé a 4.6.1 y todo vuelve a estar bien.

Stuart Aitken
fuente
0

La única forma que resolvió este problema de manera limpia para mí (.NET 4.6.1) fue no solo agregar una referencia de Nuget a System.Net.Http V4.3.4 para el proyecto que realmente usaba System.Net.Http, sino también proyecto de inicio (un proyecto de prueba en mi caso).

(Lo cual es extraño, porque el System.Net.Http.dll correcto existía en el directorio bin del proyecto de prueba y los .config assemblyBingings también se veían bien).

TvdH
fuente
0

Estaba actualizando un sitio web antiguo usando nuget (incluida la actualización .Net y la actualización MVC).

Eliminé la referencia System.Net.HTTP en VS2017 (era a la versión 2.0.0.0) y volví a agregar la referencia, que luego mostró 4.2.0.0.

Luego actualicé una tonelada de 'paquetes' usando nuget y recibí el mensaje de error, luego noté que algo había restablecido la referencia a 2.0.0.0, así que eliminé y volví a agregar y funciona bien ... extraño.

Paul Zahra
fuente