Impossible de charger le fichier ou l'assembly System.Web.Http.WebHost après sa publication sur le site Web Azure

141

J'ai créé un projet Web et il fonctionne bien dans Visual Studio. Cependant, j'ai eu l'erreur suivante après l'avoir publié sur azurewebsites. Qu'est-ce qui peut causer le problème?

Impossible de charger le fichier ou l'assembly 'System.Web.Http.WebHost, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' ou l'une de ses dépendances. La définition de manifeste de l'assembly localisé ne correspond pas à la référence d'assembly. (Exception de HRESULT: 0x80131040)

Description: une exception non gérée s'est produite lors de l'exécution de la requête Web actuelle. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails de l'exception: System.IO.FileLoadException: impossible de charger le fichier ou l'assembly 'System.Web.Http.WebHost, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' ou l'une de ses dépendances. La définition de manifeste de l'assembly localisé ne correspond pas à la référence d'assembly. (Exception de HRESULT: 0x80131040)

Erreur source:

Une exception non gérée a été générée lors de l'exécution de la requête Web actuelle. Les informations concernant l'origine et l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de pile d'exceptions ci-dessous.

Suivi du chargement de l'assembly: les informations suivantes peuvent être utiles pour déterminer pourquoi l'assembly 'System.Web.Http.WebHost, Version = 5.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' n'a pas pu être chargé.

WRN: la journalisation de la liaison d'assemblage est désactivée. Pour activer la journalisation des échecs de liaison d'assembly, définissez la valeur de Registre [HKLM \ Software \ Microsoft \ Fusion! EnableLog] (DWORD) sur 1. Remarque: Il existe une pénalité de performances associée à la journalisation des échecs de liaison d'assembly. Pour désactiver cette fonctionnalité, supprimez la valeur de registre [HKLM \ Software \ Microsoft \ Fusion! EnableLog].

Ce qui suit fait partie du fichier 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
la source

Réponses:

129

Le dllest manquant dans la publication (environnement déployé). C'est la raison pour laquelle il fonctionne dans le local, c'est-à-dire Visual Studio, mais pas dans l'environnement de site Web Azure.

Faites simplement Copy Local = truedans les propriétés de l'assembly ( System.Web.Http.WebHost ), puis effectuez un redéploiement, cela devrait fonctionner correctement.

Si vous obtenez l'erreur similaire, c'est-à-dire qu'un autre assembly est manquant, définissez cet assembly sur copylocal = true et redéployez-le, répétez-le de manière itérative - si vous n'êtes pas sûr de ses dépendances.

Naveen Vijay
la source
2
Le Copy Localest déjà vrai. Étrangement, il montre la Runtime Versionv4.0.30319 au lieu de la v5?
ca9163d9
4
Savez-vous ce qui s'est passé ici? J'avais bien fonctionné pendant 18 mois quand cela a sauté et m'a mordu.
Glenn Gordon
2
Cela a résolu le problème pour moi Merci! Mais il me semble étrange que nous devions inclure des bibliothèques de framework dans nos projets (dans mon cas pas Azure mais un serveur IIS). Est-ce que quelqu'un sait s'il s'agit d'exécuter des mises à jour pour que nous n'ayons plus à les inclure?
edgarpetrauskas
1
Mini add-on car il m'a fallu une éternité pour trouver la copie locale: Dans VS2013, vous ouvrez le nœud «références» dans le projet, et faites un clic droit-> propriétés sur la bibliothèque sur laquelle vous voulez définir «copie locale».
ArtHare
6
Si Copy Local est déjà défini sur true et que vous ne pouvez pas mettre à jour WebApi en raison de dépendances, il existe cette astuce pour définir Copy Local sur false, build, puis redéfinir Copy Local sur true et build. Je ne sais pas pourquoi cela fonctionne.
DeeArgee
90

Si vous cherchez toujours une réponse, essayez de vérifier ce fil de questions . Cela m'a aidé à résoudre un problème similaire.

edit: La solution qui m'a aidé a été d'exécuter à Update-Package Microsoft.AspNet.WebApi -reinstallpartir du gestionnaire de paquets NugGet, comme suggéré par Pathoschild. J'ai ensuite dû supprimer mon fichier .suo et redémarrer VS, comme suggéré par Sergey Osypchuk dans ce fil .

amraby
la source
S'il vous plaît éviter les réponses de lien seulement .. veuillez plutôt poster des informations pertinentes à partir du lien ci-dessus ici ..
Anvesh Yalamarthy
3
L'exécution de la commande Update-Package a résolu le problème, alors qu'aucune des autres suggestions n'a fonctionné. Merci pour la réponse!
DigiOz Multimedia
Meilleure solution au problème.
Festim Cahani
Réponse parfaite, merci!
Apolo
3
Cette solution a fonctionné pour moi aussi. Je suis assez sûr que cela a été causé par la fonctionnalité `` Supprimer les assemblages inutilisés '' de ReSharper. Supprimer les assemblys inutilisés supprime parfois aveuglément les assemblys sans vérifier le contenu du package NuGet.
Joe King
54

J'ai rencontré le même problème et je l'ai résolu en définissant CopyLocalsur true pour les bibliothèques suivantes:

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

Je dois ajouter que j'utilise MVC4 et NET 4

Bronek
la source
merci cela a été utile. Savez-vous pourquoi ces fichiers ne seraient pas simplement dans GAC? Est-ce parce que différents sites pourraient utiliser différents frameworks dotnet, etc.?
dellyjm
Si je me souviens bien, ce problème s'est produit depuis que Microsoft a appliqué des correctifs critiques dans ce domaine (je suppose que dans System.Web / ASP NET / MVC). Je suppose que ces espaces de noms ne sont pas dans GAC (donc pas dans des assemblys NET natifs) mais dans des chemins Visual Studio ou MVC séparés.
Bronek
Cela a résolu le problème sur mon VPS (ce n'est pas seulement un problème azur)
Evilripper
Cela a fonctionné pour moi (même si je n'utilise pas Azure). Je déplaçais un projet d'un environnement de cadre .net 4.5 vers un environnement 4.0 et j'ai eu ce problème à la fin de tout.
TheQ
1
Selon la suggestion de DeeArgee ci-dessus, j'avais déjà LOCAL COPY = true pour les 3 de ces dll. Mais cette suggestion a finalement résolu le problème: «Si Copy Local est déjà défini sur true, il y a cette astuce pour définir Copy Local sur false, build, puis redéfinir Copy Local sur true et build. Je ne sais pas pourquoi cela fonctionne. - DeeArgee 19 novembre 15 à 17:16
Debbie A
34

Pour moi, j'ai ajouté la section suivante au web.configfichier:

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

Cet exemple représente MVC 5.1. J'espère que cela aidera quelqu'un à résoudre ce problème.

Eadel
la source
2
Tu es incroyable. a fonctionné comme un charme dans mvc5. Merci
David Graça
2
Merci, a travaillé pour moi aussi +1, la personne qui a posé cette question devrait marquer cela comme la réponse!
Ray
Ou ajoutez simplement un Microsoft.AspNet.WebApi.WebHostpackage via nuget.
Optimax
15

Pour moi, cela a commencé à fonctionner après avoir sélectionné "Supprimer les fichiers supplémentaires à destination" dans les options de publication de fichier sous les paramètres de la boîte de dialogue de publication.

Magnus Ahlin
la source
A travaillé pour moi! Joli.
Dr Schizo
C'est la seule solution ici qui a fonctionné pour moi. Je suppose qu'il y avait une autre ancienne version d'une DLL là-bas qui a déclenché les choses. Merci!
Ohad Schneider
10

La dll est manquante dans la publication (environnement déployé). C'est la raison pour laquelle il fonctionne dans le local, c'est-à-dire Visual Studio, mais pas dans l'environnement de site Web Azure.

Faites simplement Copy Local = true dans les propriétés de l'assembly (System.Web.Http.WebHost), puis effectuez un redéploiement, cela devrait fonctionner correctement.

venkat
la source
même ici, c'est exactement ce qu'il fallait.
pabloelustondo
1
Probablement parce que c'est la même solution décrite dans plusieurs autres réponses un an plus tôt.
Tchad
6

J'utilise vs2012 et je pense que la mise à jour KB2781514 a changé certains paramètres. Tout mon System.Web.Http dans mon projet MVC4 a changé en faux et je garde reçu ce message. J'avais changé la All file in this projectpropriété de publication mais cela ne fonctionne pas. Enfin, je dois changer Copy Local = trueun par un et résoudre ce problème.

thanh
la source
2

J'ai eu la même erreur et j'ai changé ma version de 4 à 3 et c'est résolu:

<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
la source
2

J'ai eu le même problème dans ma candidature.

System.web.http.webhost not found.

Il vous suffit de copier le system.web.http.webhostfichier de votre projet principal que vous exécutez dans Visual Studio et de le coller dans votre binrépertoire de projet publié .

Après cela, il peut afficher la même erreur, mais le nom du répertoire est modifié system.web.http. Suivez la même procédure que ci-dessus. Cela fonctionnera une fois tous les fichiers téléchargés. Cela en raison du package nuget dans Visual Studio, ils téléchargent à partir d'Internet, mais sur le serveur, il ne peut pas le télécharger.

Vous pouvez trouver ce fichier dans le répertoire de votre projet bin.

Imran Khan
la source
1

Cela m'est arrivé sur VS2013 (mise à jour 5) /ASP.NET 4.5, sous le type de projet "Application Web" qui comprend MVC et Web API 2. Une erreur s'est produite juste après la création du projet et avant d'ajouter du code. L'ajout de la configuration suivante corrige le problème pour moi. Après avoir résolu le problème "System.Web.Helpers", deux autres erreurs similaires sont apparues pour "System.Web.Mvc" et "System.Web.WebPages".

<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
la source
0

Il me manquait plusieurs DLL. Même si je les copiais manuellement dans le répertoire la prochaine fois que je les publierais, ils disparaîtraient. Chacun d'eux était déjà configuré pour copier localement dans VS. Le correctif pour moi était de définir chacun sur Copier localement false, d'enregistrer, de construire puis de définir chacun d'eux pour copier localement true. Cette fois, j'ai publié toutes les DLL correctement publiées. Étrange

Grayson
la source
0

Si vous avez plusieurs projets dans votre solution et que l'un de vos projets ne parvient pas à se créer en raison de cette erreur, assurez-vous d'avoir installé le package nuget WebApi Core dans ce projet. Le simple fait d'ajouter une référence à System.Web.Http n'aide pas, vous devez installer le package nuget correct dans ce projet.

J'avais plusieurs projets dans ma solution et WebApi Core était déjà installé dans un autre projet. J'ai référencé l'assembly System.Web.Http en cliquant avec le bouton droit de la souris et en cochant l'assembly dans la liste et cela ne fonctionnait pas sur Azure, bien que localement, cela se construise correctement. J'ai dû supprimer la référence manuelle et ajouter le package nuget WebApi Core à chaque projet nécessitant la référence d'assemblage.

Ali
la source
0

Dans le cas où "Copier Local" est déjà True, je trouve que cela fonctionne parfois si vous supprimez les fichiers sur lesquels il a été publié et publiez à nouveau.

Par exemple, si vous utilisez IIS, supprimez les sites Web et le contenu du répertoire dans lequel ils sont publiés, puis publiez à nouveau.

Il peut y avoir des versions plus anciennes des fichiers à la destination, donc pour vous assurer que vous n'utilisez pas d'anciennes versions, supprimez tout avant de publier à nouveau.

Prasanth Louis
la source
0

J'ai supprimé l'entrée suivante de web.config et cela a fonctionné pour moi.

<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
la source
0

Assurez-vous que la version du package est la même dans toute la solution. Je viens de rétrograder et de mettre à niveau le Microsoft.AspNet.Mvcpackage de la solution et le problème est résolu.

Masoud Darvishian
la source