Impossibile caricare il file o l'assembly "System.Net.Http, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a"


168

Ho copiato il mio progetto su un computer Windows 10 pulito con solo Visual Studio 2015 Community e SQL Server 2016 Express installati. Non ci sono altre versioni di framework installate oltre a quelle installate con Windows 10 e VS2015 o SQL Server.

Quando provo ad avviare il progetto WebApi ricevo il messaggio:

Impossibile caricare il file o l'assembly "System.Net.Http, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a" o una delle sue dipendenze. Il sistema non trova il file specificato.

I pacchetti del progetto includono:

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

Dopo aver creato il progetto con .NET Framework 4.6.1, System.Net.Httpil file non viene trovato nella bincartella.

Il percorso del file punta a:

C: \ Programmi (x86) \ Assembly Assembly \ Microsoft \ Framework.NETFramework \ v4.6.1 \ System.Net.Http.dll

Il percorso del file System.Net.Http.Formattingpunta a:

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

L'intero progetto dovrebbe essere destinato alla 4.5.1 o esiste un altro modo per fare riferimento alle assemblee giuste?


hai provato a reinstallare Web Api dal pacchetto NuGet?
Mihai Alexandru-Ionut,


Ho provato tutte le risposte suggerite in quella domanda SO. Niente funziona finora. Ho anche corso update-package xxx -reinstallper tutti i pacchetti nuget che sto usando. Non funziona neanche.
Ivan-Mark Debono,


Basta fare riferimento questo, Thank Me Later stackoverflow.com/questions/50536842/...
Ragul

Risposte:


116

Segui i seguenti passi,

  1. Aggiorna Visual Studio all'ultima versione (è importante)
  2. Rimuovi tutti i reindirizzamenti vincolanti da web.config
  3. Aggiungi questo al .csprojfile:

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. Costruisci il progetto
  5. Nella bincartella dovrebbe esserci un (WebAppName).dll.configfile
  6. Dovrebbe contenere reindirizzamenti, copiarli nel file web.config
  7. Rimuovi quanto sopra snipped dal .csprojfile

Dovrebbe funzionare


1
Ora sto ottenendo Impossibile caricare il file o l'assembly "Newtonsoft.Json, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed" o una delle sue dipendenze. La definizione manifest dell'assembly individuato non corrisponde al riferimento dell'assembly. (Eccezione da HRESULT: 0x80131040)
EK_AllDay

2
Devi ricordare di copiare i reindirizzamenti di associazione dal file generato, quindi la prima volta otterrai l'errore sopra riportato, ma vai alla cartella bin per ottenere il generato (webappname) .dll.config come descritto sopra, copia l'intero elenco di reindirizzamenti nel tuo web.config, quindi ricompilare. Questo mi ha davvero aiutato, assicurati di usare lo strumento di consolidamento di nuget per ripulire quanti più riferimenti puoi prima però.
Chris Schaller,

4
Sorprendente. Questo ha funzionato davvero per me. @EK_AllDay È necessario copiare nuovamente AssemblyRedirects nel web.config originale.
David De Sloovere,

3
⭐☝ Il distintivo della leggenda meritato proprio qui! Solo una nota a margine, quando ho copiato AssemblyRedirects di nuovo in web.config, vedo che non esiste più un'associazione per System.Net.Http . Quindi supponiamo che VS ora stia usando l'assembly predefinito impacchettato con il framework .Net, piuttosto che la sua versione?
EvilDr

1
Questa risposta mi ha salvato tante volte che ho persino smesso di contare. Dovrebbe essere contrassegnato come risposta IMHO.
Sebastian Budka,

258

La modifica delle informazioni di associazione in my web.config (o app.config) - mentre un "hack" a mio avviso, ti consente di andare avanti con il tuo progetto dopo un aggiornamento del pacchetto NuGet che colpisce l'applicazione e ti dà System.Net.Http errore.

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
Ho distribuito in Azure, una volta, senza problemi, poi 15 minuti dopo, una distribuzione successiva mi ha dato l'esatto errore dichiarato nell'OP e ottimizzato web.config sul server con questa risposta precisa risolto il mio problema. Ma non ho idea del perché abbia mai funzionato la prima volta. Non ho pasticciato con le mie dipendenze tra le distribuzioni.
bkwdesign,

8
Buon lavoro. Riesco a vedere cosa è successo, ho installato un pacchetto in un progetto di dominio di base sul quale sono abbastanza sicuro che fosse installato il nuget System.Net.Http (probabilmente della versione 4.1.x superiore), e non appena l'ho fatto ho ottenuto questi avvertimenti ovunque. Ciò ha risolto il problema per il progetto Web, ma i consigli di cui sopra di qualcuno per fare riferimento al pacchetto nuget per quello in tutti i progetti hanno rimosso tutti gli avvisi. Sono l'unico a essere preoccupato per il mix tra il vecchio e il nuovo .NET anche quando si tratta di riferimenti? Mi fa paura fare riferimento alle DLL tipicamente locali come pacchetti nuget (inferno dll).
Nicholas Petersen,

3
Ecco la risposta di Microsoft sul perché questo è il modo corretto: github.com/dotnet/corefx/issues/25773
ghanashyaml

18
La rimozione del reindirizzamento dell'associazione ha funzionato completamente per me.
sbkrogers,

1
Sì, basta rimuovere le righe di system.net.http e system.runtime. Le cose poi vanno bene.
ZZZ,

32

In uno dei miei progetti c'erano pacchetti di nuget con una versione successiva di System.Net.Http. e nel mio progetto di avvio ci si riferisce a System.Net.Http v 4.0.0, ho appena installato il pacchetto nuget System.Net.Http nel mio progetto di avvio e il problema è stato risolto


Ho tre progetti in una soluzione - chiamiamoli A, Be C. Aè il progetto di avvio e non ha nulla a che fare con Bo C. Cè un progetto di test per B. L'esecuzione dei test Cnon è riuscita, perché non avevo un progetto di riferimento (System.Net.Http) A.
Rasmus Bækgaard,

19

Modifica seguente:

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

con il seguente:

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

in web.config


1
Sei un gangster. Questo ha risolto il mio problema!
Leonardo Wildt,

1
Grazie @LeonardoWildt
Muhammad Waqas il

12

Se nella tua soluzione sono presenti più progetti, fai clic con il pulsante destro del mouse sull'icona della soluzione in Visual Studio e seleziona "Gestisci pacchetti NuGet per soluzione", quindi fai clic sulla quarta scheda "Consolida" per consolidare tutti i tuoi progetti nella stessa versione del DLL. Ciò fornirà un elenco di assiemi referenziati da consolidare. Fai clic su ciascun elemento nell'elenco, quindi fai clic su Installa nella scheda visualizzata a destra.


4
Combinalo con la risposta di @sajeetharan sull'utilizzo di AutoGenerateBindingRedirects, sembra che le versioni precedenti dei pacchetti VS o nuget possano lasciare dichiarazioni di associazione errate. Una buona pulizia può aiutare molto.
Chris Schaller,

11

Il bind-reindirizzamento sopra non ha funzionato per me, quindi ho commentato il riferimento a System.Net.Httpin web.config. Tutto sembra funzionare bene senza di essa.

  <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
Funziona in Visual Studio 2017 (15.9.4) e consente di compilare con il pacchetto NuGet System.Net.Http (4.3.4) invece di un riferimento diretto alla DLL fornita con la versione del framework .NET 4.7.2. Per utilizzare il riferimento fornito (senza altre dipendenze introdotte) all'interno dell'IDE, procedere come segue: 1) Rimuovere i reindirizzamenti dell'associazione web / app.config 2) Rimuovere il pacchetto NuGet per System.Net.Http 3) Aprire "Aggiungi nuovo riferimento" e collegare direttamente alla nuova build 4.2.0.0 fornita con .NET 4.7.
EnocNRoll - AnandaGopal Pardue

Questo ha funzionato per me in VS2019, migrando un'app dalla 4.6.1 alla 4.7.2
cklimowski il

Avevo un progetto di app per console che funzionava come un webjob. Stava generando tale eccezione durante la creazione di un client API SendGrid. Tutto ha iniziato a funzionare dopo aver rimosso il reindirizzamento di associazione da app.config. Grazie per aver suggerito questo, non avrei mai pensato.
kurdemol94,

9

È possibile risolvere questo problema aggiornando il progetto a .NET Framework 4.7.2. A questa risposta Alex Ghiondea - MSFT . Per favore, votalo come se lo merita davvero!

Questo è documentato come un problema noto in .NET Framework 4.7.1.

Per ovviare al problema, puoi aggiungere questi obiettivi al tuo progetto. Rimuoveranno DesignFacadesToFilter dall'elenco dei riferimenti passati a SGEN (e li aggiungeranno nuovamente al termine di 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>

Un'altra opzione (a livello di macchina) è aggiungere il seguente reindirizzamento di associazione 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.

Questa risposta alla domanda di collegamento sopra è ora la risposta pertinente: stackoverflow.com/a/52883065/54289 Per i dettagli, vedere i commenti sulla risposta.
EnocNRoll - AnandaGopal Pardue

6

Funzionerà in .NET 4.7.2 con Visual Studio 2017 (15.9.4):

  • Rimuovere i reindirizzamenti dell'associazione web / app.config
  • Rimuovere il pacchetto NuGet per System.Net.Http
  • Apri "Aggiungi nuovo riferimento" e collega direttamente alla nuova build 4.2.0.0 fornita con .NET 4.7.2

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


4

Ho lo stesso problema e l'unico modo in cui sono in grado di risolverlo è aggiungere bindingRedirect ad app.confing come ha scritto @ tripletdad99.

Ma se hai una soluzione con più progetti è davvero succhiare aggiornare ogni progetto a mano (e anche a volte dopo l'aggiornamento di alcuni pacchetti nuget devi farlo di nuovo). Ed è il motivo per cui ho scritto un semplice script PowerShell che, se tutto 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"

Esempio come usare:

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

Probabilmente non è perfetto e sarà anche meglio se qualcuno lo collega a un'attività pre-build.


3

4.6.1-2 in VS2017 gli utenti possono sperimentare la sostituzione indesiderata della loro versione di System.Net.Http con quella che VS2017 o Msbuild 15 vogliono usare.

Abbiamo eliminato questa versione qui:

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

e qui:

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

Quindi il progetto si sviluppa con la versione a cui abbiamo fatto riferimento tramite NuGet.


1

Avevo questo, ma era perché avevo aggiunto un pacchetto NuGet che aveva aggiornato i reindirizzamenti di associazione. Una volta rimosso il pacchetto, i reindirizzamenti erano ancora lì. Li ho rimossi tutti e poi ho eseguito update-package -reinstall. Ciò ha aggiunto i reindirizzamenti corretti.


0

Controlla la versione del framework .net.
Il mio framework .net originale è una versione precedente.
Dopo aver installato .net framework 4.6, questo problema viene automaticamente risolto.


0

Per me, avevo impostato il mio progetto per l'esecuzione sull'ultima versione di .Net Framework (una modifica da .Net Framework 4.6.1 a 4.7.2).

Tutto ha funzionato, senza errori e pubblicato senza problemi, ed è stato solo per caso che mi sono imbattuto nel messaggio di errore System.Net.Http, mostrato in una richiesta API piccola, difficile da notare, ma abbastanza importante sul sito Web I ' sto lavorando su.

Sono tornato alla 4.6.1 e tutto va di nuovo bene.


0

L'unico modo che ha risolto in modo chiaro questo problema per me (.NET 4.6.1) è stato non solo aggiungere un riferimento Nuget a System.Net.Http V4.3.4 per il progetto che effettivamente utilizzava System.Net.Http, ma anche al progetto di avvio (un progetto di prova nel mio caso).

(Il che è strano, perché il System.Net.Http.dll corretto esisteva nella directory bin del progetto di test e anche l'assemblaggio .config sembrava OK.)


0

Stava aggiornando un vecchio sito Web usando nuget (incluso l'aggiornamento .Net e l'aggiornamento MVC).

Ho eliminato il riferimento System.Net.HTTP in VS2017 (era alla versione 2.0.0.0) e ho aggiunto nuovamente il riferimento, che quindi mostrava 4.2.0.0.

Ho quindi aggiornato un sacco di "pacchetti" usando nuget e ho ricevuto il messaggio di errore, poi ho notato che qualcosa aveva ripristinato il riferimento a 2.0.0.0, quindi ho rimosso e aggiunto di nuovo e funziona benissimo ... bizzarro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.