Datei oder Assembly System.Web.Http.WebHost konnte nach der Veröffentlichung auf der Azure-Website nicht geladen werden

141

Ich habe ein Webprojekt erstellt und es läuft gut in Visual Studio. Ich habe jedoch den folgenden Fehler erhalten, nachdem ich ihn auf azurewebsites veröffentlicht habe. Was kann das Problem verursachen?

Datei oder Assembly 'System.Web.Http.WebHost, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die Manifestdefinition der gefundenen Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040)

Beschreibung: Während der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stapelverfolgung, um weitere Informationen über den Fehler und dessen Ursprung im Code zu erhalten.

Ausnahmedetails: System.IO.FileLoadException: Datei oder Assembly 'System.Web.Http.WebHost, Version = 5.0.0.0, Kultur = neutral, PublicKeyToken = 31bf3856ad364e35' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die Manifestdefinition der gefundenen Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040)

Quellfehler:

Während der Ausführung der aktuellen Webanforderung wurde eine nicht behandelte Ausnahme generiert. Informationen zum Ursprung und Ort der Ausnahme können mithilfe der folgenden Ausnahmestapelverfolgung identifiziert werden.

Assembly Load Trace: Die folgenden Informationen können hilfreich sein, um festzustellen, warum die Assembly 'System.Web.Http.WebHost, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' nicht geladen werden konnte.

WRN: Die Protokollierung der Baugruppenbindung ist deaktiviert. Setzen Sie den Registrierungswert [HKLM \ Software \ Microsoft \ Fusion! EnableLog] (DWORD) auf 1, um die Protokollierung von Assemblybindungsfehlern zu aktivieren. Hinweis: Mit der Protokollierung von Assemblybindungsfehlern sind einige Leistungseinbußen verbunden. Entfernen Sie den Registrierungswert [HKLM \ Software \ Microsoft \ Fusion! EnableLog], um diese Funktion zu deaktivieren.

Das Folgende ist Teil der Datei web.config.

  <system.web>
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
  <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers></system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
ca9163d9
quelle

Antworten:

129

Das dll fehlt in der veröffentlichten (bereitgestellten Umgebung). Dies ist der Grund, warum es im lokalen, dh Visual Studio, aber nicht in der Azure-Website-Umgebung funktioniert.

Führen Sie einfach Copy Local = truedie Eigenschaften für die Assembly aus ( System.Web.Http.WebHost ) und führen Sie dann eine erneute Bereitstellung durch. Dies sollte einwandfrei funktionieren.

Wenn der ähnliche Fehler auftritt, dh eine andere Assembly fehlt, machen Sie diese Assembly zu copylocal = true und stellen Sie sie erneut bereit. Wiederholen Sie dies iterativ - wenn Sie sich nicht sicher sind, welche Abhängigkeiten sie haben.

Naveen Vijay
quelle
2
Das Copy Localist schon wahr. Seltsamerweise zeigt Runtime Versiones, dass v4.0.30319 statt v5 ist?
ca9163d9
4
Weißt du was hier passiert ist? Ich war seit 18 Monaten in Ordnung, als dies aufsprang und mich biss.
Glenn Gordon
2
Dies hat das Problem für mich behoben. Danke! Mir kommt es jedoch seltsam vor, dass wir Framework-Bibliotheken in unsere Projekte aufnehmen müssen (in meinem Fall nicht Azure, sondern ein IIS-Server). Weiß jemand, ob es darum geht, einige Updates auszuführen, damit wir sie nicht mehr einschließen müssen?
Edgarpetrauskas
1
Mini-Add-On, da ich ewig gebraucht habe, um die lokale Kopie zu finden: In VS2013 öffnen Sie den Knoten "Referenzen" im Projekt und klicken mit der rechten Maustaste auf die Eigenschaften der Bibliothek, für die Sie die lokale Kopie festlegen möchten.
ArtHare
6
Wenn Copy Local bereits auf true gesetzt ist und Sie das WebApi aufgrund von Abhängigkeiten nicht aktualisieren können, gibt es diesen Trick, um Copy Local auf false zu setzen, zu erstellen und dann Copy Local wieder auf true zu setzen und zu erstellen. Ich weiß nicht warum das funktioniert.
DeeArgee
90

Wenn Sie immer noch nach einer Antwort suchen, überprüfen Sie diesen Fragenthread . Es hat mir geholfen, ein ähnliches Problem zu lösen.

Bearbeiten: Die Lösung, die mir geholfen hat, war die Ausführung Update-Package Microsoft.AspNet.WebApi -reinstallüber den NugGet-Paketmanager, wie von Pathoschild vorgeschlagen. Ich musste dann meine .suo-Datei löschen und VS neu starten, wie von Sergey Osypchuk in diesem Thread vorgeschlagen .

Amraby
quelle
Bitte vermeiden Sie nur Linkantworten. Bitte posten Sie relevante Informationen vom obigen Link hier.
Anvesh Yalamarthy
3
Durch Ausführen des Befehls Update-Package wurde das Problem behoben, während keiner der anderen Vorschläge funktionierte. Danke für die Antwort!
DigiOz Multimedia
Beste Lösung für das Problem.
Festim Cahani
Perfekte Antwort, danke!
Apolo
3
Diese Lösung hat auch bei mir funktioniert. Ich bin mir ziemlich sicher, dass dies durch die ReSharper-Funktion "Nicht verwendete Baugruppen entfernen" verursacht wurde. Nicht verwendete Baugruppen entfernen entfernt Baugruppen manchmal blind, ohne den Inhalt des NuGet-Pakets zu überprüfen.
Joe King
54

Ich bin auf dasselbe Problem gestoßen und habe es behoben, indem ich CopyLocalfür die folgenden Bibliotheken auf true gesetzt habe:

System.Web.Http.dll
System.Web.Http.WebHost.dll
System.Net.Http.Formatting.dll

Ich muss hinzufügen, dass ich MVC4 und NET 4 verwende

Bronek
quelle
Danke, das war hilfreich. Wissen Sie, warum diese Dateien nicht nur in GAC gespeichert sind? Liegt es daran, dass verschiedene Sites unterschiedliche Dotnet-Frameworks usw. verwenden könnten?
Dellyjm
Soweit ich mich erinnere, ist dieses Problem aufgetreten, seit Microsoft kritische Korrekturen in diesem Bereich vorgenommen hat (ich denke in System.Web / ASP NET / MVC). Ich denke, diese Namespaces befinden sich nicht in GAC (also nicht in nativen NET-Assemblys), sondern in separaten Visual Studio- oder MVC-Pfaden.
Bronek
Dies löste das Problem auf meinem VPS (dies ist nicht nur ein azurblaues Problem)
Evilripper
Dies hat bei mir funktioniert (obwohl ich Azure nicht verwende). Ich habe ein Projekt von einer .net 4.5-Framework-Umgebung auf eine 4.0-Umgebung verschoben und dieses Problem am Ende von allem bekommen.
TheQ
1
Gemäß dem obigen Vorschlag von DeeArgee hatte ich bereits LOCAL COPY = true für alle 3 dieser DLLs. Aber dieser Vorschlag löste schließlich das Problem: "Wenn Copy Local bereits auf true gesetzt ist, gibt es diesen Trick, um Copy Local auf false zu setzen, zu erstellen und dann Copy Local wieder auf true zu setzen und zu erstellen. Ich weiß nicht, warum dies funktioniert. - DeeArgee 19. November 15 um 17:16
Debbie A
34

Für mich hat das Hinzufügen des folgenden Abschnitts zur web.configDatei gearbeitet:

<configuration>
...
    <runtime>
    ...
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Http.WebHost" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
        </dependentAssembly>
    ...
    </runtime>
...
</configuration>

Dieses Beispiel steht für MVC 5.1. Hoffe, es wird jemandem helfen, ein solches Problem zu lösen.

Eadel
quelle
2
Du bist toll. arbeitete wie ein Zauber in mvc5. Vielen Dank
David Graça
2
Danke, hat auch für mich gearbeitet +1, die Person, die diese Frage gestellt hat, sollte dies als Antwort markieren!
Ray
Oder fügen Sie einfach ein Microsoft.AspNet.WebApi.WebHostPaket über Nuget hinzu.
Optimax
15

Für mich fing es an zu funktionieren, nachdem ich in den Veröffentlichungsoptionen für Dateien unter Einstellungen im Veröffentlichungsdialog "Zusätzliche Dateien am Zielort entfernen" ausgewählt hatte.

Magnus Ahlin
quelle
Hat für mich gearbeitet! Schön.
Dr. Schizo
Dies ist die einzige Lösung, die hier für mich funktioniert hat. Ich denke, es gab eine andere alte Version einer DLL, die die Dinge auslöste. Vielen Dank!
Ohad Schneider
10

Die DLL fehlt in der veröffentlichten (bereitgestellten Umgebung). Dies ist der Grund, warum es im lokalen, dh Visual Studio, aber nicht in der Azure-Website-Umgebung funktioniert.

Kopieren Sie einfach Local = true in den Eigenschaften für die Assembly (System.Web.Http.WebHost) und führen Sie dann eine erneute Bereitstellung durch. Dies sollte einwandfrei funktionieren.

venkat
quelle
Genau hier wurde genau das benötigt.
Pabloelustondo
1
Wahrscheinlich, weil es dieselbe Lösung ist, die ein Jahr zuvor in mehreren anderen Antworten beschrieben wurde.
Tschad
6

Ich verwende vs2012 und ich denke, das Update KB2781514 hat einige Einstellungen geändert. Alle meine System.Web.Http in meinem MVC4-Projekt wurden in false geändert und ich habe diese Nachricht weiterhin erhalten. Ich hatte die All file in this projectEigenschaft "In Publish" geändert , aber sie funktioniert nicht. Schließlich muss ich Copy Local = trueeins nach dem anderen ändern und dieses Problem lösen.

thanh
quelle
2

Ich habe den gleichen Fehler erhalten und meine Version von 4 auf 3 geändert und es ist behoben:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <!-- Ensure correct version of MVC -->
    <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
    </dependentAssembly>
</assemblyBinding>
Ilaria
quelle
2

Ich hatte das gleiche Problem in meiner Bewerbung.

System.web.http.webhost not found.

Sie müssen nur die system.web.http.webhostDatei aus Ihrem Hauptprojekt kopieren, das Sie in Visual Studio ausführen, und sie in Ihr veröffentlichtes Projektverzeichnis einfügen bin.

Danach wird möglicherweise derselbe Fehler angezeigt, aber der Verzeichnisname wird möglicherweise geändert system.web.http. Gehen Sie wie oben beschrieben vor. Es funktioniert, nachdem alle Dateien hochgeladen wurden. Dies liegt an dem Nuget-Paket in Visual Studio, das sie aus dem Internet herunterladen, aber auf dem Server nicht herunterladen können.

Sie finden diese Datei in Ihrem Projektverzeichnis bin.

Imran Khan
quelle
1

Dies ist mir unter VS2013 (Update 5) / ASP.NET 4.5 unter dem Projekttyp "Webanwendung" passiert, der MVC und Web-API 2 enthält. Der Fehler trat direkt nach dem Erstellen des Projekts und vor dem Hinzufügen von Code auf. Das Hinzufügen der folgenden Konfiguration behebt das Problem für mich. Nach dem Beheben von "System.Web.Helpers" sind zwei weitere ähnliche Fehler für "System.Web.Mvc" und "System.Web.WebPages" aufgetreten.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
Masoud Safi
quelle
0

Mir fehlten mehrere DLLs. Selbst wenn ich sie bei der nächsten Veröffentlichung manuell in das Verzeichnis kopieren würde, würden sie verschwinden. Jeder war bereits so eingestellt, dass er in VS lokal kopiert. Die Lösung für mich bestand darin, jedes auf Lokal falsch kopieren, speichern, erstellen und dann auf lokal wahr setzen zu setzen. Diesmal habe ich alle DLLs korrekt veröffentlicht. Seltsam

Grayson
quelle
0

Wenn Ihre Lösung mehrere Projekte enthält und eines Ihrer Projekte aufgrund dieses Fehlers nicht erstellt werden kann, stellen Sie sicher, dass Sie das WebApi Core-Nuget-Paket in diesem Projekt installiert haben. Das Hinzufügen eines Verweises auf System.Web.Http hilft nicht weiter. Sie müssen das richtige Nuget-Paket in diesem Projekt installieren.

Ich hatte mehrere Projekte in meiner Lösung und WebApi Core wurde bereits in einem anderen Projekt installiert. Ich habe auf die System.Web.Http-Assembly verwiesen, indem ich mit der rechten Maustaste auf die Assembly in der Liste geklickt und sie angekreuzt habe. In Azure funktionierte sie nicht, obwohl sie lokal in Ordnung wäre. Ich musste die manuelle Referenz entfernen und das WebApi Core Nuget-Paket zu jedem Projekt hinzufügen, das die Assemblyreferenz benötigte.

Ali
quelle
0

Wenn "Lokal kopieren" bereits "Wahr" ist, funktioniert es manchmal, wenn Sie die Dateien entfernen, in denen es veröffentlicht wurde, und erneut veröffentlichen.

Wenn Sie beispielsweise IIS verwenden, entfernen Sie die Websites und den Inhalt des Verzeichnisses, in dem sie veröffentlicht werden, und veröffentlichen Sie sie erneut.

Möglicherweise befinden sich am Zielort ältere Versionen von Dateien. Um sicherzustellen, dass Sie keine älteren Versionen verwenden, löschen Sie alles, bevor Sie erneut veröffentlichen.

Prasanth Louis
quelle
0

Ich habe den folgenden Eintrag aus web.config entfernt und es hat bei mir funktioniert.

<dependentAssembly>
                <assemblyIdentity name="System.Web.Http.WebHost" culture="neutral" publicKeyToken="31BF3856AD364E35" />
                <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="5.2.6.0" />
            </dependentAssembly>
Ibrahim Mohammed
quelle
0

Stellen Sie sicher, dass die Paketversion für die gesamte Lösung gleich ist. Ich habe gerade das Microsoft.AspNet.MvcPaket für die gesamte Lösung heruntergestuft und aktualisiert und das Problem gelöst.

Masoud Darvishian
quelle